From 7a79219383c83c71cc9751c0d72830428fac0db0 Mon Sep 17 00:00:00 2001 From: Sam James Date: Fri, 22 Nov 2024 19:30:47 +0000 Subject: [PATCH] zlib: import zlib-1.3.1 This is vanilla zlib-1.3.1 imported over the existing zlib/ dir with: * README adjusted to add the GCC note at the top; * GCC's ChangeLog merged with the upstream one, as before; * Deleted upstream Makefile as has been done before (we use an autoconf- generated one) --- zlib/CMakeLists.txt | 83 +- zlib/FAQ | 5 +- zlib/LICENSE | 22 + zlib/README | 24 +- zlib/adler32.c | 34 +- zlib/compress.c | 23 +- zlib/contrib/README.contrib | 23 +- zlib/contrib/ada/readme.txt | 4 +- zlib/contrib/ada/test.adb | 4 +- zlib/contrib/ada/zlib-streams.ads | 2 +- zlib/contrib/ada/zlib.adb | 2 +- zlib/contrib/ada/zlib.ads | 2 +- zlib/contrib/blast/blast.h | 2 +- zlib/contrib/delphi/ZLib.pas | 2 +- zlib/contrib/dotzlib/DotZLib.chm | Bin 72728 -> 72726 bytes zlib/contrib/dotzlib/DotZLib/ChecksumImpl.cs | 4 +- zlib/contrib/dotzlib/DotZLib/CodecBase.cs | 4 +- zlib/contrib/dotzlib/DotZLib/GZipStream.cs | 6 +- zlib/contrib/dotzlib/DotZLib/UnitTests.cs | 2 +- zlib/contrib/dotzlib/readme.txt | 2 +- zlib/contrib/infback9/infback9.c | 24 +- zlib/contrib/infback9/infback9.h | 16 +- zlib/contrib/infback9/inftree9.c | 17 +- zlib/contrib/infback9/inftree9.h | 12 +- zlib/contrib/iostream2/zstream.h | 2 +- zlib/contrib/iostream3/zfstream.h | 4 +- zlib/contrib/minizip/Makefile | 14 +- zlib/contrib/minizip/MiniZip64_Changes.txt | 2 +- zlib/contrib/minizip/configure.ac | 2 +- zlib/contrib/minizip/crypt.h | 29 +- zlib/contrib/minizip/ioapi.c | 78 +- zlib/contrib/minizip/ioapi.h | 46 +- zlib/contrib/minizip/iowin32.c | 70 +- zlib/contrib/minizip/iowin32.h | 8 +- zlib/contrib/minizip/miniunz.c | 103 +- zlib/contrib/minizip/minizip.c | 87 +- zlib/contrib/minizip/mztools.c | 8 +- zlib/contrib/minizip/unzip.c | 552 +- zlib/contrib/minizip/unzip.h | 150 +- zlib/contrib/minizip/zip.c | 367 +- zlib/contrib/minizip/zip.h | 310 +- zlib/contrib/nuget/nuget.csproj | 43 + zlib/contrib/nuget/nuget.sln | 22 + zlib/contrib/pascal/zlibpas.pas | 2 +- zlib/contrib/puff/README | 2 +- zlib/contrib/puff/puff.c | 12 +- zlib/contrib/puff/pufftest.c | 2 +- zlib/contrib/puff/zeros.raw | Bin 1213 -> 2517 bytes zlib/contrib/testzlib/testzlib.c | 2 +- zlib/contrib/untgz/untgz.c | 63 +- zlib/contrib/vstudio/readme.txt | 159 +- .../vstudio/vc10/miniunz.vcxproj.filters | 2 +- .../vstudio/vc10/minizip.vcxproj.filters | 2 +- zlib/contrib/vstudio/vc10/testzlib.vcxproj | 24 +- .../vstudio/vc10/testzlib.vcxproj.filters | 5 +- .../vstudio/vc10/testzlibdll.vcxproj.filters | 2 +- zlib/contrib/vstudio/vc10/zlib.rc | 8 +- zlib/contrib/vstudio/vc10/zlibstat.vcxproj | 50 +- .../vstudio/vc10/zlibstat.vcxproj.filters | 3 - zlib/contrib/vstudio/vc10/zlibvc.def | 7 +- zlib/contrib/vstudio/vc10/zlibvc.vcxproj | 58 +- .../vstudio/vc10/zlibvc.vcxproj.filters | 3 - zlib/contrib/vstudio/vc11/testzlib.vcxproj | 24 +- zlib/contrib/vstudio/vc11/zlib.rc | 8 +- zlib/contrib/vstudio/vc11/zlibstat.vcxproj | 34 +- zlib/contrib/vstudio/vc11/zlibvc.def | 7 +- zlib/contrib/vstudio/vc11/zlibvc.vcxproj | 58 +- zlib/contrib/vstudio/vc12/testzlib.vcxproj | 24 +- zlib/contrib/vstudio/vc12/zlib.rc | 8 +- zlib/contrib/vstudio/vc12/zlibstat.vcxproj | 34 +- zlib/contrib/vstudio/vc12/zlibvc.def | 7 +- zlib/contrib/vstudio/vc12/zlibvc.vcxproj | 58 +- zlib/contrib/vstudio/vc14/testzlib.vcxproj | 24 +- zlib/contrib/vstudio/vc14/zlib.rc | 8 +- zlib/contrib/vstudio/vc14/zlibstat.vcxproj | 34 +- zlib/contrib/vstudio/vc14/zlibvc.def | 7 +- zlib/contrib/vstudio/vc14/zlibvc.vcxproj | 58 +- zlib/contrib/vstudio/vc17/miniunz.vcxproj | 409 + zlib/contrib/vstudio/vc17/minizip.vcxproj | 405 + zlib/contrib/vstudio/vc17/testzlib.vcxproj | 473 + zlib/contrib/vstudio/vc17/testzlibdll.vcxproj | 409 + zlib/contrib/vstudio/vc17/zlib.rc | 32 + zlib/contrib/vstudio/vc17/zlibstat.vcxproj | 602 + zlib/contrib/vstudio/vc17/zlibvc.def | 158 + zlib/contrib/vstudio/vc17/zlibvc.sln | 179 + zlib/contrib/vstudio/vc17/zlibvc.vcxproj | 875 ++ zlib/contrib/vstudio/vc9/miniunz.vcproj | 2 +- zlib/contrib/vstudio/vc9/minizip.vcproj | 2 +- zlib/contrib/vstudio/vc9/testzlib.vcproj | 66 +- zlib/contrib/vstudio/vc9/testzlibdll.vcproj | 2 +- zlib/contrib/vstudio/vc9/zlib.rc | 8 +- zlib/contrib/vstudio/vc9/zlibstat.vcproj | 76 +- zlib/contrib/vstudio/vc9/zlibvc.def | 7 +- zlib/contrib/vstudio/vc9/zlibvc.vcproj | 82 +- zlib/crc32.c | 1255 ++- zlib/crc32.h | 9877 ++++++++++++++++- zlib/deflate.c | 882 +- zlib/deflate.h | 76 +- zlib/doc/algorithm.txt | 2 +- zlib/doc/crc-doc.1.0.pdf | Bin 0 -> 776142 bytes zlib/doc/txtvsbin.txt | 12 +- zlib/examples/README.examples | 5 + zlib/examples/enough.c | 745 +- zlib/examples/fitblk.c | 6 +- zlib/examples/gun.c | 2 +- zlib/examples/gzappend.c | 6 +- zlib/examples/gzlog.c | 10 +- zlib/examples/gzlog.h | 2 +- zlib/examples/gznorm.c | 470 + zlib/examples/zlib_how.html | 26 +- zlib/examples/zran.c | 740 +- zlib/examples/zran.h | 51 + zlib/gzclose.c | 4 +- zlib/gzguts.h | 32 +- zlib/gzlib.c | 119 +- zlib/gzread.c | 108 +- zlib/gzwrite.c | 118 +- zlib/infback.c | 50 +- zlib/inffast.c | 33 +- zlib/inffast.h | 2 +- zlib/inflate.c | 185 +- zlib/inflate.h | 5 +- zlib/inftrees.c | 17 +- zlib/inftrees.h | 12 +- zlib/make_vms.com | 4 +- zlib/old/visual-basic.txt | 2 +- zlib/os400/README400 | 6 +- zlib/os400/bndsrc | 8 + zlib/os400/zlib.inc | 8 +- zlib/qnx/package.qpg | 10 +- zlib/test/example.c | 112 +- zlib/test/infcover.c | 5 +- zlib/test/minigzip.c | 176 +- zlib/treebuild.xml | 4 +- zlib/trees.c | 676 +- zlib/uncompr.c | 18 +- zlib/win32/DLL_FAQ.txt | 20 +- zlib/win32/Makefile.bor | 1 - zlib/win32/Makefile.gcc | 5 - zlib/win32/Makefile.msc | 4 - zlib/win32/README-WIN32.txt | 8 +- zlib/win32/zlib.def | 4 + zlib/win32/zlib1.rc | 2 +- zlib/zconf.h | 55 +- zlib/zconf.h.cmakein | 37 +- zlib/zconf.h.in | 37 +- zlib/zlib.3 | 6 +- zlib/zlib.3.pdf | Bin 0 -> 25523 bytes zlib/zlib.h | 592 +- zlib/zlib.map | 194 +- zlib/zutil.c | 68 +- zlib/zutil.h | 67 +- 152 files changed, 18294 insertions(+), 5489 deletions(-) create mode 100644 zlib/LICENSE create mode 100644 zlib/contrib/nuget/nuget.csproj create mode 100644 zlib/contrib/nuget/nuget.sln create mode 100644 zlib/contrib/vstudio/vc17/miniunz.vcxproj create mode 100644 zlib/contrib/vstudio/vc17/minizip.vcxproj create mode 100644 zlib/contrib/vstudio/vc17/testzlib.vcxproj create mode 100644 zlib/contrib/vstudio/vc17/testzlibdll.vcxproj create mode 100644 zlib/contrib/vstudio/vc17/zlib.rc create mode 100644 zlib/contrib/vstudio/vc17/zlibstat.vcxproj create mode 100644 zlib/contrib/vstudio/vc17/zlibvc.def create mode 100644 zlib/contrib/vstudio/vc17/zlibvc.sln create mode 100644 zlib/contrib/vstudio/vc17/zlibvc.vcxproj create mode 100644 zlib/doc/crc-doc.1.0.pdf create mode 100644 zlib/examples/gznorm.c create mode 100644 zlib/examples/zran.h create mode 100644 zlib/zlib.3.pdf diff --git a/zlib/CMakeLists.txt b/zlib/CMakeLists.txt index 0fe939df6893..15ceebe787e7 100644 --- a/zlib/CMakeLists.txt +++ b/zlib/CMakeLists.txt @@ -1,12 +1,11 @@ -cmake_minimum_required(VERSION 2.4.4) +cmake_minimum_required(VERSION 2.4.4...3.15.0) set(CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS ON) project(zlib C) -set(VERSION "1.2.11") +set(VERSION "1.3.1") -option(ASM686 "Enable building i686 assembly implementation") -option(AMD64 "Enable building amd64 assembly implementation") +option(ZLIB_BUILD_EXAMPLES "Enable Zlib Examples" ON) set(INSTALL_BIN_DIR "${CMAKE_INSTALL_PREFIX}/bin" CACHE PATH "Installation directory for executables") set(INSTALL_LIB_DIR "${CMAKE_INSTALL_PREFIX}/lib" CACHE PATH "Installation directory for libraries") @@ -129,39 +128,6 @@ if(NOT MINGW) ) endif() -if(CMAKE_COMPILER_IS_GNUCC) - if(ASM686) - set(ZLIB_ASMS contrib/asm686/match.S) - elseif (AMD64) - set(ZLIB_ASMS contrib/amd64/amd64-match.S) - endif () - - if(ZLIB_ASMS) - add_definitions(-DASMV) - set_source_files_properties(${ZLIB_ASMS} PROPERTIES LANGUAGE C COMPILE_FLAGS -DNO_UNDERLINE) - endif() -endif() - -if(MSVC) - if(ASM686) - ENABLE_LANGUAGE(ASM_MASM) - set(ZLIB_ASMS - contrib/masmx86/inffas32.asm - contrib/masmx86/match686.asm - ) - elseif (AMD64) - ENABLE_LANGUAGE(ASM_MASM) - set(ZLIB_ASMS - contrib/masmx64/gvmat64.asm - contrib/masmx64/inffasx64.asm - ) - endif() - - if(ZLIB_ASMS) - add_definitions(-DASMV -DASMINF) - endif() -endif() - # parse the full version number from zlib.h and include in ZLIB_FULL_VERSION file(READ ${CMAKE_CURRENT_SOURCE_DIR}/zlib.h _zlib_h_contents) string(REGEX REPLACE ".*#define[ \t]+ZLIB_VERSION[ \t]+\"([-0-9A-Za-z.]+)\".*" @@ -183,8 +149,10 @@ if(MINGW) set(ZLIB_DLL_SRCS ${CMAKE_CURRENT_BINARY_DIR}/zlib1rc.obj) endif(MINGW) -add_library(zlib SHARED ${ZLIB_SRCS} ${ZLIB_ASMS} ${ZLIB_DLL_SRCS} ${ZLIB_PUBLIC_HDRS} ${ZLIB_PRIVATE_HDRS}) -add_library(zlibstatic STATIC ${ZLIB_SRCS} ${ZLIB_ASMS} ${ZLIB_PUBLIC_HDRS} ${ZLIB_PRIVATE_HDRS}) +add_library(zlib SHARED ${ZLIB_SRCS} ${ZLIB_DLL_SRCS} ${ZLIB_PUBLIC_HDRS} ${ZLIB_PRIVATE_HDRS}) +target_include_directories(zlib PUBLIC ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}) +add_library(zlibstatic STATIC ${ZLIB_SRCS} ${ZLIB_PUBLIC_HDRS} ${ZLIB_PRIVATE_HDRS}) +target_include_directories(zlibstatic PUBLIC ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}) set_target_properties(zlib PROPERTIES DEFINE_SYMBOL ZLIB_DLL) set_target_properties(zlib PROPERTIES SOVERSION 1) @@ -202,7 +170,7 @@ endif() if(UNIX) # On unix-like platforms the library is almost always called libz set_target_properties(zlib zlibstatic PROPERTIES OUTPUT_NAME z) - if(NOT APPLE) + if(NOT APPLE AND NOT(CMAKE_SYSTEM_NAME STREQUAL AIX)) set_target_properties(zlib PROPERTIES LINK_FLAGS "-Wl,--version-script,\"${CMAKE_CURRENT_SOURCE_DIR}/zlib.map\"") endif() elseif(BUILD_SHARED_LIBS AND WIN32) @@ -229,21 +197,22 @@ endif() #============================================================================ # Example binaries #============================================================================ - -add_executable(example test/example.c) -target_link_libraries(example zlib) -add_test(example example) - -add_executable(minigzip test/minigzip.c) -target_link_libraries(minigzip zlib) - -if(HAVE_OFF64_T) - add_executable(example64 test/example.c) - target_link_libraries(example64 zlib) - set_target_properties(example64 PROPERTIES COMPILE_FLAGS "-D_FILE_OFFSET_BITS=64") - add_test(example64 example64) - - add_executable(minigzip64 test/minigzip.c) - target_link_libraries(minigzip64 zlib) - set_target_properties(minigzip64 PROPERTIES COMPILE_FLAGS "-D_FILE_OFFSET_BITS=64") +if(ZLIB_BUILD_EXAMPLES) + add_executable(example test/example.c) + target_link_libraries(example zlib) + add_test(example example) + + add_executable(minigzip test/minigzip.c) + target_link_libraries(minigzip zlib) + + if(HAVE_OFF64_T) + add_executable(example64 test/example.c) + target_link_libraries(example64 zlib) + set_target_properties(example64 PROPERTIES COMPILE_FLAGS "-D_FILE_OFFSET_BITS=64") + add_test(example64 example64) + + add_executable(minigzip64 test/minigzip.c) + target_link_libraries(minigzip64 zlib) + set_target_properties(minigzip64 PROPERTIES COMPILE_FLAGS "-D_FILE_OFFSET_BITS=64") + endif() endif() diff --git a/zlib/FAQ b/zlib/FAQ index 99b7cf92e454..92f5d3e29fab 100644 --- a/zlib/FAQ +++ b/zlib/FAQ @@ -4,7 +4,7 @@ If your question is not there, please check the zlib home page http://zlib.net/ which may have more recent information. -The lastest zlib FAQ is at http://zlib.net/zlib_faq.html +The latest zlib FAQ is at http://zlib.net/zlib_faq.html 1. Is zlib Y2K-compliant? @@ -14,8 +14,7 @@ The lastest zlib FAQ is at http://zlib.net/zlib_faq.html 2. Where can I get a Windows DLL version? The zlib sources can be compiled without change to produce a DLL. See the - file win32/DLL_FAQ.txt in the zlib distribution. Pointers to the - precompiled DLL are found in the zlib web site at http://zlib.net/ . + file win32/DLL_FAQ.txt in the zlib distribution. 3. Where can I get a Visual Basic interface to zlib? diff --git a/zlib/LICENSE b/zlib/LICENSE new file mode 100644 index 000000000000..ab8ee6f71428 --- /dev/null +++ b/zlib/LICENSE @@ -0,0 +1,22 @@ +Copyright notice: + + (C) 1995-2022 Jean-loup Gailly and Mark Adler + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + + Jean-loup Gailly Mark Adler + jloup@gzip.org madler@alumni.caltech.edu diff --git a/zlib/README b/zlib/README index 92e9d5c64a7d..3f5a990c9d59 100644 --- a/zlib/README +++ b/zlib/README @@ -3,7 +3,7 @@ shipped with GCC as convenience. ZLIB DATA COMPRESSION LIBRARY -zlib 1.2.11 is a general purpose data compression library. All the code is +zlib 1.3.1 is a general purpose data compression library. All the code is thread safe. The data format used by the zlib library is described by RFCs (Request for Comments) 1950 to 1952 in the files http://tools.ietf.org/html/rfc1950 (zlib format), rfc1951 (deflate format) and @@ -32,18 +32,17 @@ PLEASE read the zlib FAQ http://zlib.net/zlib_faq.html before asking for help. Mark Nelson wrote an article about zlib for the Jan. 1997 issue of Dr. Dobb's Journal; a copy of the article is available at -http://marknelson.us/1997/01/01/zlib-engine/ . +https://marknelson.us/posts/1997/01/01/zlib-engine.html . -The changes made in version 1.2.11 are documented in the file ChangeLog. +The changes made in version 1.3.1 are documented in the file ChangeLog. Unsupported third party contributions are provided in directory contrib/ . -zlib is available in Java using the java.util.zip package, documented at -http://java.sun.com/developer/technicalArticles/Programming/compression/ . +zlib is available in Java using the java.util.zip package. Follow the API +Documentation link at: https://docs.oracle.com/search/?q=java.util.zip . -A Perl interface to zlib written by Paul Marquess is available -at CPAN (Comprehensive Perl Archive Network) sites, including -http://search.cpan.org/~pmqs/IO-Compress-Zlib/ . +A Perl interface to zlib and bzip2 written by Paul Marquess +can be found at https://github.com/pmqs/IO-Compress . A Python interface to zlib written by A.M. Kuchling is available in Python 1.5 and later versions, see @@ -67,7 +66,7 @@ Notes for some targets: - zlib doesn't work with gcc 2.6.3 on a DEC 3000/300LX under OSF/1 2.1 it works when compiled with cc. -- On Digital Unix 4.0D (formely OSF/1) on AlphaServer, the cc option -std1 is +- On Digital Unix 4.0D (formerly OSF/1) on AlphaServer, the cc option -std1 is necessary to get gzprintf working correctly. This is done by configure. - zlib doesn't work on HP-UX 9.05 with some versions of /bin/cc. It works with @@ -87,7 +86,7 @@ Acknowledgments: Copyright notice: - (C) 1995-2017 Jean-loup Gailly and Mark Adler + (C) 1995-2024 Jean-loup Gailly and Mark Adler This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -111,7 +110,10 @@ Copyright notice: If you use the zlib library in a product, we would appreciate *not* receiving lengthy legal documents to sign. The sources are provided for free but without warranty of any kind. The library has been entirely written by Jean-loup -Gailly and Mark Adler; it does not include third-party code. +Gailly and Mark Adler; it does not include third-party code. We make all +contributions to and distributions of this project solely in our personal +capacity, and are not conveying any rights to any intellectual property of +any third parties. If you redistribute modified sources, we would appreciate that you include in the file ChangeLog history information documenting your changes. Please read diff --git a/zlib/adler32.c b/zlib/adler32.c index b3d35e2a891b..04b81d29bad1 100644 --- a/zlib/adler32.c +++ b/zlib/adler32.c @@ -3,12 +3,10 @@ * For conditions of distribution and use, see copyright notice in zlib.h */ -/* @(#) $Id: adler32.c,v 1.1.1.2 2002/03/11 21:53:23 tromey Exp $ */ +/* @(#) $Id$ */ #include "zutil.h" -local uLong adler32_combine_ OF((uLong adler1, uLong adler2, z_off64_t len2)); - #define BASE 65521U /* largest prime smaller than 65536 */ #define NMAX 5552 /* NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1 */ @@ -60,11 +58,7 @@ local uLong adler32_combine_ OF((uLong adler1, uLong adler2, z_off64_t len2)); #endif /* ========================================================================= */ -uLong ZEXPORT adler32_z(adler, buf, len) - uLong adler; - const Bytef *buf; - z_size_t len; -{ +uLong ZEXPORT adler32_z(uLong adler, const Bytef *buf, z_size_t len) { unsigned long sum2; unsigned n; @@ -131,20 +125,12 @@ uLong ZEXPORT adler32_z(adler, buf, len) } /* ========================================================================= */ -uLong ZEXPORT adler32(adler, buf, len) - uLong adler; - const Bytef *buf; - uInt len; -{ +uLong ZEXPORT adler32(uLong adler, const Bytef *buf, uInt len) { return adler32_z(adler, buf, len); } /* ========================================================================= */ -local uLong adler32_combine_(adler1, adler2, len2) - uLong adler1; - uLong adler2; - z_off64_t len2; -{ +local uLong adler32_combine_(uLong adler1, uLong adler2, z_off64_t len2) { unsigned long sum1; unsigned long sum2; unsigned rem; @@ -169,18 +155,10 @@ local uLong adler32_combine_(adler1, adler2, len2) } /* ========================================================================= */ -uLong ZEXPORT adler32_combine(adler1, adler2, len2) - uLong adler1; - uLong adler2; - z_off_t len2; -{ +uLong ZEXPORT adler32_combine(uLong adler1, uLong adler2, z_off_t len2) { return adler32_combine_(adler1, adler2, len2); } -uLong ZEXPORT adler32_combine64(adler1, adler2, len2) - uLong adler1; - uLong adler2; - z_off64_t len2; -{ +uLong ZEXPORT adler32_combine64(uLong adler1, uLong adler2, z_off64_t len2) { return adler32_combine_(adler1, adler2, len2); } diff --git a/zlib/compress.c b/zlib/compress.c index bb443c6fcf10..f43bacf7ab97 100644 --- a/zlib/compress.c +++ b/zlib/compress.c @@ -3,7 +3,7 @@ * For conditions of distribution and use, see copyright notice in zlib.h */ -/* @(#) $Id: compress.c,v 1.1.1.2 2002/03/11 21:53:23 tromey Exp $ */ +/* @(#) $Id$ */ #define ZLIB_INTERNAL #include "zlib.h" @@ -19,13 +19,8 @@ memory, Z_BUF_ERROR if there was not enough room in the output buffer, Z_STREAM_ERROR if the level parameter is invalid. */ -int ZEXPORT compress2 (dest, destLen, source, sourceLen, level) - Bytef *dest; - uLongf *destLen; - const Bytef *source; - uLong sourceLen; - int level; -{ +int ZEXPORT compress2(Bytef *dest, uLongf *destLen, const Bytef *source, + uLong sourceLen, int level) { z_stream stream; int err; const uInt max = (uInt)-1; @@ -65,12 +60,8 @@ int ZEXPORT compress2 (dest, destLen, source, sourceLen, level) /* =========================================================================== */ -int ZEXPORT compress (dest, destLen, source, sourceLen) - Bytef *dest; - uLongf *destLen; - const Bytef *source; - uLong sourceLen; -{ +int ZEXPORT compress(Bytef *dest, uLongf *destLen, const Bytef *source, + uLong sourceLen) { return compress2(dest, destLen, source, sourceLen, Z_DEFAULT_COMPRESSION); } @@ -78,9 +69,7 @@ int ZEXPORT compress (dest, destLen, source, sourceLen) If the default memLevel or windowBits for deflateInit() is changed, then this function needs to be updated. */ -uLong ZEXPORT compressBound (sourceLen) - uLong sourceLen; -{ +uLong ZEXPORT compressBound(uLong sourceLen) { return sourceLen + (sourceLen >> 12) + (sourceLen >> 14) + (sourceLen >> 25) + 13; } diff --git a/zlib/contrib/README.contrib b/zlib/contrib/README.contrib index a411d5c396bd..5e5f95054090 100644 --- a/zlib/contrib/README.contrib +++ b/zlib/contrib/README.contrib @@ -1,4 +1,4 @@ -All files under this contrib directory are UNSUPPORTED. There were +All files under this contrib directory are UNSUPPORTED. They were provided by users of zlib and were not tested by the authors of zlib. Use at your own risk. Please contact the authors of the contributions for help about these, not the zlib authors. Thanks. @@ -8,14 +8,6 @@ ada/ by Dmitriy Anisimkov Support for Ada See http://zlib-ada.sourceforge.net/ -amd64/ by Mikhail Teterin - asm code for AMD64 - See patch at http://www.freebsd.org/cgi/query-pr.cgi?pr=bin/96393 - -asm686/ by Brian Raiter - asm code for Pentium and PPro/PII, using the AT&T (GNU as) syntax - See http://www.muppetlabs.com/~breadbox/software/assembly.html - blast/ by Mark Adler Decompressor for output of PKWare Data Compression Library (DCL) @@ -32,9 +24,6 @@ gcc_gvmat64/by Gilles Vollant infback9/ by Mark Adler Unsupported diffs to infback to decode the deflate64 format -inflate86/ by Chris Anderson - Tuned x86 gcc asm code to replace inflate_fast() - iostream/ by Kevin Ruland A C++ I/O streams interface to the zlib gz* functions @@ -45,16 +34,6 @@ iostream3/ by Ludwig Schwardt and Kevin Ruland Yet another C++ I/O streams interface -masmx64/ by Gilles Vollant - x86 64-bit (AMD64 and Intel EM64t) code for x64 assembler to - replace longest_match() and inflate_fast(), also masm x86 - 64-bits translation of Chris Anderson inflate_fast() - -masmx86/ by Gilles Vollant - x86 asm code to replace longest_match() and inflate_fast(), - for Visual C++ and MASM (32 bits). - Based on Brian Raiter (asm686) and Chris Anderson (inflate86) - minizip/ by Gilles Vollant Mini zip and unzip based on zlib Includes Zip64 support by Mathias Svensson diff --git a/zlib/contrib/ada/readme.txt b/zlib/contrib/ada/readme.txt index ce4d2cadf0d9..efdd639fba31 100644 --- a/zlib/contrib/ada/readme.txt +++ b/zlib/contrib/ada/readme.txt @@ -8,8 +8,8 @@ It provides Ada-style access to the ZLib C library. Here are the main changes since ZLib.Ada 1.2: -- Attension: ZLib.Read generic routine have a initialization requirement - for Read_Last parameter now. It is a bit incompartible with previous version, +- Attention: ZLib.Read generic routine have a initialization requirement + for Read_Last parameter now. It is a bit incompatible with previous version, but extends functionality, we could use new parameters Allow_Read_Some and Flush now. diff --git a/zlib/contrib/ada/test.adb b/zlib/contrib/ada/test.adb index 90773acfa186..8b3503150857 100644 --- a/zlib/contrib/ada/test.adb +++ b/zlib/contrib/ada/test.adb @@ -65,12 +65,12 @@ procedure Test is Time_Stamp : Ada.Calendar.Time; procedure Generate_File; - -- Generate file of spetsified size with some random data. + -- Generate file of specified size with some random data. -- The random data is repeatable, for the good compression. procedure Compare_Streams (Left, Right : in out Root_Stream_Type'Class); - -- The procedure compearing data in 2 streams. + -- The procedure comparing data in 2 streams. -- It is for compare data before and after compression/decompression. procedure Compare_Files (Left, Right : String); diff --git a/zlib/contrib/ada/zlib-streams.ads b/zlib/contrib/ada/zlib-streams.ads index 8e26cd450838..af136933e1db 100644 --- a/zlib/contrib/ada/zlib-streams.ads +++ b/zlib/contrib/ada/zlib-streams.ads @@ -62,7 +62,7 @@ package ZLib.Streams is := Default_Buffer_Size; Write_Buffer_Size : in Ada.Streams.Stream_Element_Offset := Default_Buffer_Size); - -- Create the Comression/Decompression stream. + -- Create the Compression/Decompression stream. -- If mode is In_Stream then Write operation is disabled. -- If mode is Out_Stream then Read operation is disabled. diff --git a/zlib/contrib/ada/zlib.adb b/zlib/contrib/ada/zlib.adb index 8b6fd686ac77..c1abe791d613 100644 --- a/zlib/contrib/ada/zlib.adb +++ b/zlib/contrib/ada/zlib.adb @@ -204,7 +204,7 @@ package body ZLib is end if; -- We allow ZLib to make header only in case of default header type. - -- Otherwise we would either do header by ourselfs, or do not do + -- Otherwise we would either do header by ourselves, or do not do -- header at all. if Header = None or else Header = GZip then diff --git a/zlib/contrib/ada/zlib.ads b/zlib/contrib/ada/zlib.ads index 79ffc4095cf4..81aaf1b6ae45 100644 --- a/zlib/contrib/ada/zlib.ads +++ b/zlib/contrib/ada/zlib.ads @@ -114,7 +114,7 @@ package ZLib is -- Compression strategy constants -- ------------------------------------ - -- RLE stategy could be used only in version 1.2.0 and later. + -- RLE strategy could be used only in version 1.2.0 and later. Filtered : constant Strategy_Type; Huffman_Only : constant Strategy_Type; diff --git a/zlib/contrib/blast/blast.h b/zlib/contrib/blast/blast.h index 6cf65eda16e5..ef8544c53b64 100644 --- a/zlib/contrib/blast/blast.h +++ b/zlib/contrib/blast/blast.h @@ -57,7 +57,7 @@ int blast(blast_in infun, void *inhow, blast_out outfun, void *outhow, * use by the application to pass an input descriptor to infun(), if desired. * * If left and in are not NULL and *left is not zero when blast() is called, - * then the *left bytes are *in are consumed for input before infun() is used. + * then the *left bytes at *in are consumed for input before infun() is used. * * The output function is invoked: err = outfun(how, buf, len), where the bytes * to be written are buf[0..len-1]. If err is not zero, then blast() returns diff --git a/zlib/contrib/delphi/ZLib.pas b/zlib/contrib/delphi/ZLib.pas index 060e1991186b..93fa4c9edb0d 100644 --- a/zlib/contrib/delphi/ZLib.pas +++ b/zlib/contrib/delphi/ZLib.pas @@ -152,7 +152,7 @@ procedure DecompressToUserBuf(const InBuf: Pointer; InBytes: Integer; const OutBuf: Pointer; BufSize: Integer); const - zlib_version = '1.2.11'; + zlib_version = '1.3.1'; type EZlibError = class(Exception); diff --git a/zlib/contrib/dotzlib/DotZLib.chm b/zlib/contrib/dotzlib/DotZLib.chm index 0bc7df76e407dcc69094483a6e9507240fe257ab..f214a444aebb20950fb3e8499b36731e1f12be95 100644 GIT binary patch delta 20 cc-ot>gJs$dmJRNyn>|vc=Wb77V%#DL09=R&1^@s6 delta 24 gc-ot`gJs4JmJRNyjGUX@Q>EuJa&AvzV%#DL0C9W>7XSbN diff --git a/zlib/contrib/dotzlib/DotZLib/ChecksumImpl.cs b/zlib/contrib/dotzlib/DotZLib/ChecksumImpl.cs index 788b2fcecedb..de88dcf1162b 100644 --- a/zlib/contrib/dotzlib/DotZLib/ChecksumImpl.cs +++ b/zlib/contrib/dotzlib/DotZLib/ChecksumImpl.cs @@ -34,7 +34,7 @@ namespace DotZLib } /// - /// Initializes a new instance of the checksum generator basewith a specified value + /// Initializes a new instance of the checksum generator base with a specified value /// /// The value to set the current checksum to public ChecksumGeneratorBase(uint initialValue) @@ -61,7 +61,7 @@ namespace DotZLib /// The sum of offset and count is larger than the length of data /// data is a null reference /// Offset or count is negative. - /// All the other Update methods are implmeneted in terms of this one. + /// All the other Update methods are implemented in terms of this one. /// This is therefore the only method a derived class has to implement public abstract void Update(byte[] data, int offset, int count); diff --git a/zlib/contrib/dotzlib/DotZLib/CodecBase.cs b/zlib/contrib/dotzlib/DotZLib/CodecBase.cs index 42e6da3a5652..c4bc8b8796bc 100644 --- a/zlib/contrib/dotzlib/DotZLib/CodecBase.cs +++ b/zlib/contrib/dotzlib/DotZLib/CodecBase.cs @@ -139,7 +139,7 @@ namespace DotZLib /// This must be implemented by a derived class protected abstract void CleanUp(); - // performs the release of the handles and calls the dereived CleanUp() + // performs the release of the handles and calls the derived CleanUp() private void CleanUp(bool isDisposing) { if (!_isDisposed) @@ -160,7 +160,7 @@ namespace DotZLib #region Helper methods /// - /// Copies a number of bytes to the internal codec buffer - ready for proccesing + /// Copies a number of bytes to the internal codec buffer - ready for processing /// /// The byte array that contains the data to copy /// The index of the first byte to copy diff --git a/zlib/contrib/dotzlib/DotZLib/GZipStream.cs b/zlib/contrib/dotzlib/DotZLib/GZipStream.cs index b161300b1859..58091d3a3e2a 100644 --- a/zlib/contrib/dotzlib/DotZLib/GZipStream.cs +++ b/zlib/contrib/dotzlib/DotZLib/GZipStream.cs @@ -246,7 +246,7 @@ namespace DotZLib } /// - /// Not suppported. + /// Not supported. /// /// /// @@ -268,7 +268,7 @@ namespace DotZLib } /// - /// Gets/sets the current position in the GZipStream. Not suppported. + /// Gets/sets the current position in the GZipStream. Not supported. /// /// In this implementation this property is not supported /// Always thrown @@ -285,7 +285,7 @@ namespace DotZLib } /// - /// Gets the size of the stream. Not suppported. + /// Gets the size of the stream. Not supported. /// /// In this implementation this property is not supported /// Always thrown diff --git a/zlib/contrib/dotzlib/DotZLib/UnitTests.cs b/zlib/contrib/dotzlib/DotZLib/UnitTests.cs index 44f76332ba09..d4f0980237c0 100644 --- a/zlib/contrib/dotzlib/DotZLib/UnitTests.cs +++ b/zlib/contrib/dotzlib/DotZLib/UnitTests.cs @@ -156,7 +156,7 @@ namespace DotZLibTests public void Info_Version() { Info info = new Info(); - Assert.AreEqual("1.2.11", Info.Version); + Assert.AreEqual("1.3.1", Info.Version); Assert.AreEqual(32, info.SizeOfUInt); Assert.AreEqual(32, info.SizeOfULong); Assert.AreEqual(32, info.SizeOfPointer); diff --git a/zlib/contrib/dotzlib/readme.txt b/zlib/contrib/dotzlib/readme.txt index b2395720d4c5..47454fce37da 100644 --- a/zlib/contrib/dotzlib/readme.txt +++ b/zlib/contrib/dotzlib/readme.txt @@ -36,7 +36,7 @@ Build instructions: in the same directory as the DotZLib.build file. You can define 2 properties on the nant command-line to control the build: debug={true|false} to toggle between release/debug builds (default=true). - nunit={true|false} to include or esclude unit tests (default=true). + nunit={true|false} to include or exclude unit tests (default=true). Also the target clean will remove binaries. Output file (DotZLib.dll) will be found in either ./DotZLib/bin/release or ./DotZLib/bin/debug, depending on whether you are building the release diff --git a/zlib/contrib/infback9/infback9.c b/zlib/contrib/infback9/infback9.c index 05fb3e338070..742a39214aba 100644 --- a/zlib/contrib/infback9/infback9.c +++ b/zlib/contrib/infback9/infback9.c @@ -16,12 +16,8 @@ window is a user-supplied window and output buffer that is 64K bytes. */ -int ZEXPORT inflateBack9Init_(strm, window, version, stream_size) -z_stream FAR *strm; -unsigned char FAR *window; -const char *version; -int stream_size; -{ +int ZEXPORT inflateBack9Init_(z_stream FAR *strm, unsigned char FAR *window, + const char *version, int stream_size) { struct inflate_state FAR *state; if (version == Z_NULL || version[0] != ZLIB_VERSION[0] || @@ -51,8 +47,7 @@ int stream_size; #ifdef MAKEFIXED #include -void makefixed9(void) -{ +void makefixed9(void) { unsigned sym, bits, low, size; code *next, *lenfix, *distfix; struct inflate_state state; @@ -214,13 +209,8 @@ void makefixed9(void) inflateBack() can also return Z_STREAM_ERROR if the input parameters are not correct, i.e. strm is Z_NULL or the state was not initialized. */ -int ZEXPORT inflateBack9(strm, in, in_desc, out, out_desc) -z_stream FAR *strm; -in_func in; -void FAR *in_desc; -out_func out; -void FAR *out_desc; -{ +int ZEXPORT inflateBack9(z_stream FAR *strm, in_func in, void FAR *in_desc, + out_func out, void FAR *out_desc) { struct inflate_state FAR *state; z_const unsigned char FAR *next; /* next input */ unsigned char FAR *put; /* next output */ @@ -603,9 +593,7 @@ void FAR *out_desc; return ret; } -int ZEXPORT inflateBack9End(strm) -z_stream FAR *strm; -{ +int ZEXPORT inflateBack9End(z_stream FAR *strm) { if (strm == Z_NULL || strm->state == Z_NULL || strm->zfree == (free_func)0) return Z_STREAM_ERROR; ZFREE(strm, strm->state); diff --git a/zlib/contrib/infback9/infback9.h b/zlib/contrib/infback9/infback9.h index 1073c0a38e6c..8371b4ec7d23 100644 --- a/zlib/contrib/infback9/infback9.h +++ b/zlib/contrib/infback9/infback9.h @@ -20,14 +20,14 @@ extern "C" { #endif -ZEXTERN int ZEXPORT inflateBack9 OF((z_stream FAR *strm, - in_func in, void FAR *in_desc, - out_func out, void FAR *out_desc)); -ZEXTERN int ZEXPORT inflateBack9End OF((z_stream FAR *strm)); -ZEXTERN int ZEXPORT inflateBack9Init_ OF((z_stream FAR *strm, - unsigned char FAR *window, - const char *version, - int stream_size)); +ZEXTERN int ZEXPORT inflateBack9(z_stream FAR *strm, + in_func in, void FAR *in_desc, + out_func out, void FAR *out_desc); +ZEXTERN int ZEXPORT inflateBack9End(z_stream FAR *strm); +ZEXTERN int ZEXPORT inflateBack9Init_(z_stream FAR *strm, + unsigned char FAR *window, + const char *version, + int stream_size); #define inflateBack9Init(strm, window) \ inflateBack9Init_((strm), (window), \ ZLIB_VERSION, sizeof(z_stream)) diff --git a/zlib/contrib/infback9/inftree9.c b/zlib/contrib/infback9/inftree9.c index 5f4a76798d88..ac707ed3fbd5 100644 --- a/zlib/contrib/infback9/inftree9.c +++ b/zlib/contrib/infback9/inftree9.c @@ -1,5 +1,5 @@ /* inftree9.c -- generate Huffman trees for efficient decoding - * Copyright (C) 1995-2017 Mark Adler + * Copyright (C) 1995-2024 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -9,7 +9,7 @@ #define MAXBITS 15 const char inflate9_copyright[] = - " inflate9 1.2.11 Copyright 1995-2017 Mark Adler "; + " inflate9 1.3.1 Copyright 1995-2024 Mark Adler "; /* If you use the zlib library in a product, an acknowledgment is welcome in the documentation of your product. If for some reason you cannot @@ -29,14 +29,9 @@ const char inflate9_copyright[] = table index bits. It will differ if the request is greater than the longest code or if it is less than the shortest code. */ -int inflate_table9(type, lens, codes, table, bits, work) -codetype type; -unsigned short FAR *lens; -unsigned codes; -code FAR * FAR *table; -unsigned FAR *bits; -unsigned short FAR *work; -{ +int inflate_table9(codetype type, unsigned short FAR *lens, unsigned codes, + code FAR * FAR *table, unsigned FAR *bits, + unsigned short FAR *work) { unsigned len; /* a code's length in bits */ unsigned sym; /* index of code symbols */ unsigned min, max; /* minimum and maximum code lengths */ @@ -64,7 +59,7 @@ unsigned short FAR *work; static const unsigned short lext[31] = { /* Length codes 257..285 extra */ 128, 128, 128, 128, 128, 128, 128, 128, 129, 129, 129, 129, 130, 130, 130, 130, 131, 131, 131, 131, 132, 132, 132, 132, - 133, 133, 133, 133, 144, 77, 202}; + 133, 133, 133, 133, 144, 203, 77}; static const unsigned short dbase[32] = { /* Distance codes 0..31 base */ 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073, diff --git a/zlib/contrib/infback9/inftree9.h b/zlib/contrib/infback9/inftree9.h index 5ab21f0c6d11..ab2ea28b2ba5 100644 --- a/zlib/contrib/infback9/inftree9.h +++ b/zlib/contrib/infback9/inftree9.h @@ -38,11 +38,11 @@ typedef struct { /* Maximum size of the dynamic table. The maximum number of code structures is 1446, which is the sum of 852 for literal/length codes and 594 for distance codes. These values were found by exhaustive searches using the program - examples/enough.c found in the zlib distribtution. The arguments to that + examples/enough.c found in the zlib distribution. The arguments to that program are the number of symbols, the initial root table size, and the maximum bit length of a code. "enough 286 9 15" for literal/length codes - returns returns 852, and "enough 32 6 15" for distance codes returns 594. - The initial root table size (9 or 6) is found in the fifth argument of the + returns 852, and "enough 32 6 15" for distance codes returns 594. The + initial root table size (9 or 6) is found in the fifth argument of the inflate_table() calls in infback9.c. If the root table size is changed, then these maximum sizes would be need to be recalculated and updated. */ #define ENOUGH_LENS 852 @@ -56,6 +56,6 @@ typedef enum { DISTS } codetype; -extern int inflate_table9 OF((codetype type, unsigned short FAR *lens, - unsigned codes, code FAR * FAR *table, - unsigned FAR *bits, unsigned short FAR *work)); +extern int inflate_table9(codetype type, unsigned short FAR *lens, + unsigned codes, code FAR * FAR *table, + unsigned FAR *bits, unsigned short FAR *work); diff --git a/zlib/contrib/iostream2/zstream.h b/zlib/contrib/iostream2/zstream.h index be7829ba3dc1..43d2332b79b7 100644 --- a/zlib/contrib/iostream2/zstream.h +++ b/zlib/contrib/iostream2/zstream.h @@ -21,7 +21,7 @@ /* * zstream.h - C++ interface to the 'zlib' general purpose compression library - * $Id: zstream.h,v 1.1 1999/05/04 19:30:27 tromey Exp $ + * $Id: zstream.h 1.1 1997-06-25 12:00:56+02 tyge Exp tyge $ */ #include diff --git a/zlib/contrib/iostream3/zfstream.h b/zlib/contrib/iostream3/zfstream.h index 8574479ae1e7..3dabc0f97d56 100644 --- a/zlib/contrib/iostream3/zfstream.h +++ b/zlib/contrib/iostream3/zfstream.h @@ -413,7 +413,7 @@ template class gzomanip2 { public: - // Allows insertor to peek at internals + // Allows inserter to peek at internals template friend gzofstream& operator<<(gzofstream&, @@ -452,7 +452,7 @@ template : func(f), val1(v1), val2(v2) { } -// Insertor applies underlying manipulator function to stream +// Inserter applies underlying manipulator function to stream template inline gzofstream& operator<<(gzofstream& s, const gzomanip2& m) diff --git a/zlib/contrib/minizip/Makefile b/zlib/contrib/minizip/Makefile index 84eaad20d4fb..3d927ec149e0 100644 --- a/zlib/contrib/minizip/Makefile +++ b/zlib/contrib/minizip/Makefile @@ -1,5 +1,5 @@ -CC=cc -CFLAGS=-O -I../.. +CC?=cc +CFLAGS := $(CFLAGS) -O -I../.. UNZ_OBJS = miniunz.o unzip.o ioapi.o ../../libz.a ZIP_OBJS = minizip.o zip.o ioapi.o ../../libz.a @@ -16,10 +16,14 @@ minizip: $(ZIP_OBJS) $(CC) $(CFLAGS) -o $@ $(ZIP_OBJS) test: miniunz minizip - ./minizip test readme.txt + @rm -f test.* + @echo hello hello hello > test.txt + ./minizip test test.txt ./miniunz -l test.zip - mv readme.txt readme.old + @mv test.txt test.old ./miniunz test.zip + @cmp test.txt test.old + @rm -f test.* clean: - /bin/rm -f *.o *~ minizip miniunz + /bin/rm -f *.o *~ minizip miniunz test.* diff --git a/zlib/contrib/minizip/MiniZip64_Changes.txt b/zlib/contrib/minizip/MiniZip64_Changes.txt index 13a1bd91a9b0..3759468113ba 100644 --- a/zlib/contrib/minizip/MiniZip64_Changes.txt +++ b/zlib/contrib/minizip/MiniZip64_Changes.txt @@ -1,5 +1,5 @@ -MiniZip 1.1 was derrived from MiniZip at version 1.01f +MiniZip 1.1 was derived from MiniZip at version 1.01f Change in 1.0 (Okt 2009) - **TODO - Add history** diff --git a/zlib/contrib/minizip/configure.ac b/zlib/contrib/minizip/configure.ac index 5b11970977f0..15ec917189c3 100644 --- a/zlib/contrib/minizip/configure.ac +++ b/zlib/contrib/minizip/configure.ac @@ -1,7 +1,7 @@ # -*- Autoconf -*- # Process this file with autoconf to produce a configure script. -AC_INIT([minizip], [1.2.11], [bugzilla.redhat.com]) +AC_INIT([minizip], [1.3.1], [bugzilla.redhat.com]) AC_CONFIG_SRCDIR([minizip.c]) AM_INIT_AUTOMAKE([foreign]) LT_INIT diff --git a/zlib/contrib/minizip/crypt.h b/zlib/contrib/minizip/crypt.h index 1e9e8200b201..f4b93b78dc31 100644 --- a/zlib/contrib/minizip/crypt.h +++ b/zlib/contrib/minizip/crypt.h @@ -32,12 +32,12 @@ /*********************************************************************** * Return the next byte in the pseudo-random sequence */ -static int decrypt_byte(unsigned long* pkeys, const z_crc_t* pcrc_32_tab) -{ +static int decrypt_byte(unsigned long* pkeys, const z_crc_t* pcrc_32_tab) { unsigned temp; /* POTENTIAL BUG: temp*(temp^1) may overflow in an * unpredictable manner on 16-bit systems; not a problem * with any known compiler so far, though */ + (void)pcrc_32_tab; temp = ((unsigned)(*(pkeys+2)) & 0xffff) | 2; return (int)(((temp * (temp ^ 1)) >> 8) & 0xff); } @@ -45,8 +45,7 @@ static int decrypt_byte(unsigned long* pkeys, const z_crc_t* pcrc_32_tab) /*********************************************************************** * Update the encryption keys with the next byte of plain text */ -static int update_keys(unsigned long* pkeys,const z_crc_t* pcrc_32_tab,int c) -{ +static int update_keys(unsigned long* pkeys, const z_crc_t* pcrc_32_tab, int c) { (*(pkeys+0)) = CRC32((*(pkeys+0)), c); (*(pkeys+1)) += (*(pkeys+0)) & 0xff; (*(pkeys+1)) = (*(pkeys+1)) * 134775813L + 1; @@ -62,8 +61,7 @@ static int update_keys(unsigned long* pkeys,const z_crc_t* pcrc_32_tab,int c) * Initialize the encryption keys and the random header according to * the given password. */ -static void init_keys(const char* passwd,unsigned long* pkeys,const z_crc_t* pcrc_32_tab) -{ +static void init_keys(const char* passwd, unsigned long* pkeys, const z_crc_t* pcrc_32_tab) { *(pkeys+0) = 305419896L; *(pkeys+1) = 591751049L; *(pkeys+2) = 878082192L; @@ -77,24 +75,23 @@ static void init_keys(const char* passwd,unsigned long* pkeys,const z_crc_t* pcr (update_keys(pkeys,pcrc_32_tab,c ^= decrypt_byte(pkeys,pcrc_32_tab))) #define zencode(pkeys,pcrc_32_tab,c,t) \ - (t=decrypt_byte(pkeys,pcrc_32_tab), update_keys(pkeys,pcrc_32_tab,c), t^(c)) + (t=decrypt_byte(pkeys,pcrc_32_tab), update_keys(pkeys,pcrc_32_tab,c), (Byte)t^(c)) #ifdef INCLUDECRYPTINGCODE_IFCRYPTALLOWED #define RAND_HEAD_LEN 12 /* "last resort" source for second part of crypt seed pattern */ # ifndef ZCR_SEED2 -# define ZCR_SEED2 3141592654UL /* use PI as default pattern */ +# define ZCR_SEED2 3141592654UL /* use PI as default pattern */ # endif -static int crypthead(const char* passwd, /* password string */ - unsigned char* buf, /* where to write header */ - int bufSize, - unsigned long* pkeys, - const z_crc_t* pcrc_32_tab, - unsigned long crcForCrypting) -{ - int n; /* index in random header */ +static unsigned crypthead(const char* passwd, /* password string */ + unsigned char* buf, /* where to write header */ + int bufSize, + unsigned long* pkeys, + const z_crc_t* pcrc_32_tab, + unsigned long crcForCrypting) { + unsigned n; /* index in random header */ int t; /* temporary */ int c; /* random byte */ unsigned char header[RAND_HEAD_LEN-2]; /* random header */ diff --git a/zlib/contrib/minizip/ioapi.c b/zlib/contrib/minizip/ioapi.c index 7f5c191b2afd..782d32469ae5 100644 --- a/zlib/contrib/minizip/ioapi.c +++ b/zlib/contrib/minizip/ioapi.c @@ -14,7 +14,7 @@ #define _CRT_SECURE_NO_WARNINGS #endif -#if defined(__APPLE__) || defined(IOAPI_NO_64) +#if defined(__APPLE__) || defined(IOAPI_NO_64) || defined(__HAIKU__) || defined(MINIZIP_FOPEN_NO_64) // In darwin and perhaps other BSD variants off_t is a 64 bit value, hence no need for specific 64 bit functions #define FOPEN_FUNC(filename, mode) fopen(filename, mode) #define FTELLO_FUNC(stream) ftello(stream) @@ -28,8 +28,7 @@ #include "ioapi.h" -voidpf call_zopen64 (const zlib_filefunc64_32_def* pfilefunc,const void*filename,int mode) -{ +voidpf call_zopen64 (const zlib_filefunc64_32_def* pfilefunc, const void*filename, int mode) { if (pfilefunc->zfile_func64.zopen64_file != NULL) return (*(pfilefunc->zfile_func64.zopen64_file)) (pfilefunc->zfile_func64.opaque,filename,mode); else @@ -38,8 +37,7 @@ voidpf call_zopen64 (const zlib_filefunc64_32_def* pfilefunc,const void*filename } } -long call_zseek64 (const zlib_filefunc64_32_def* pfilefunc,voidpf filestream, ZPOS64_T offset, int origin) -{ +long call_zseek64 (const zlib_filefunc64_32_def* pfilefunc,voidpf filestream, ZPOS64_T offset, int origin) { if (pfilefunc->zfile_func64.zseek64_file != NULL) return (*(pfilefunc->zfile_func64.zseek64_file)) (pfilefunc->zfile_func64.opaque,filestream,offset,origin); else @@ -52,13 +50,12 @@ long call_zseek64 (const zlib_filefunc64_32_def* pfilefunc,voidpf filestream, ZP } } -ZPOS64_T call_ztell64 (const zlib_filefunc64_32_def* pfilefunc,voidpf filestream) -{ +ZPOS64_T call_ztell64 (const zlib_filefunc64_32_def* pfilefunc, voidpf filestream) { if (pfilefunc->zfile_func64.zseek64_file != NULL) return (*(pfilefunc->zfile_func64.ztell64_file)) (pfilefunc->zfile_func64.opaque,filestream); else { - uLong tell_uLong = (*(pfilefunc->ztell32_file))(pfilefunc->zfile_func64.opaque,filestream); + uLong tell_uLong = (uLong)(*(pfilefunc->ztell32_file))(pfilefunc->zfile_func64.opaque,filestream); if ((tell_uLong) == MAXU32) return (ZPOS64_T)-1; else @@ -66,11 +63,9 @@ ZPOS64_T call_ztell64 (const zlib_filefunc64_32_def* pfilefunc,voidpf filestream } } -void fill_zlib_filefunc64_32_def_from_filefunc32(zlib_filefunc64_32_def* p_filefunc64_32,const zlib_filefunc_def* p_filefunc32) -{ +void fill_zlib_filefunc64_32_def_from_filefunc32(zlib_filefunc64_32_def* p_filefunc64_32, const zlib_filefunc_def* p_filefunc32) { p_filefunc64_32->zfile_func64.zopen64_file = NULL; p_filefunc64_32->zopen32_file = p_filefunc32->zopen_file; - p_filefunc64_32->zfile_func64.zerror_file = p_filefunc32->zerror_file; p_filefunc64_32->zfile_func64.zread_file = p_filefunc32->zread_file; p_filefunc64_32->zfile_func64.zwrite_file = p_filefunc32->zwrite_file; p_filefunc64_32->zfile_func64.ztell64_file = NULL; @@ -84,18 +79,10 @@ void fill_zlib_filefunc64_32_def_from_filefunc32(zlib_filefunc64_32_def* p_filef -static voidpf ZCALLBACK fopen_file_func OF((voidpf opaque, const char* filename, int mode)); -static uLong ZCALLBACK fread_file_func OF((voidpf opaque, voidpf stream, void* buf, uLong size)); -static uLong ZCALLBACK fwrite_file_func OF((voidpf opaque, voidpf stream, const void* buf,uLong size)); -static ZPOS64_T ZCALLBACK ftell64_file_func OF((voidpf opaque, voidpf stream)); -static long ZCALLBACK fseek64_file_func OF((voidpf opaque, voidpf stream, ZPOS64_T offset, int origin)); -static int ZCALLBACK fclose_file_func OF((voidpf opaque, voidpf stream)); -static int ZCALLBACK ferror_file_func OF((voidpf opaque, voidpf stream)); - -static voidpf ZCALLBACK fopen_file_func (voidpf opaque, const char* filename, int mode) -{ +static voidpf ZCALLBACK fopen_file_func(voidpf opaque, const char* filename, int mode) { FILE* file = NULL; const char* mode_fopen = NULL; + (void)opaque; if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER)==ZLIB_FILEFUNC_MODE_READ) mode_fopen = "rb"; else @@ -110,10 +97,10 @@ static voidpf ZCALLBACK fopen_file_func (voidpf opaque, const char* filename, in return file; } -static voidpf ZCALLBACK fopen64_file_func (voidpf opaque, const void* filename, int mode) -{ +static voidpf ZCALLBACK fopen64_file_func(voidpf opaque, const void* filename, int mode) { FILE* file = NULL; const char* mode_fopen = NULL; + (void)opaque; if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER)==ZLIB_FILEFUNC_MODE_READ) mode_fopen = "rb"; else @@ -129,39 +116,39 @@ static voidpf ZCALLBACK fopen64_file_func (voidpf opaque, const void* filename, } -static uLong ZCALLBACK fread_file_func (voidpf opaque, voidpf stream, void* buf, uLong size) -{ +static uLong ZCALLBACK fread_file_func(voidpf opaque, voidpf stream, void* buf, uLong size) { uLong ret; + (void)opaque; ret = (uLong)fread(buf, 1, (size_t)size, (FILE *)stream); return ret; } -static uLong ZCALLBACK fwrite_file_func (voidpf opaque, voidpf stream, const void* buf, uLong size) -{ +static uLong ZCALLBACK fwrite_file_func(voidpf opaque, voidpf stream, const void* buf, uLong size) { uLong ret; + (void)opaque; ret = (uLong)fwrite(buf, 1, (size_t)size, (FILE *)stream); return ret; } -static long ZCALLBACK ftell_file_func (voidpf opaque, voidpf stream) -{ +static long ZCALLBACK ftell_file_func(voidpf opaque, voidpf stream) { long ret; + (void)opaque; ret = ftell((FILE *)stream); return ret; } -static ZPOS64_T ZCALLBACK ftell64_file_func (voidpf opaque, voidpf stream) -{ +static ZPOS64_T ZCALLBACK ftell64_file_func(voidpf opaque, voidpf stream) { ZPOS64_T ret; - ret = FTELLO_FUNC((FILE *)stream); + (void)opaque; + ret = (ZPOS64_T)FTELLO_FUNC((FILE *)stream); return ret; } -static long ZCALLBACK fseek_file_func (voidpf opaque, voidpf stream, uLong offset, int origin) -{ +static long ZCALLBACK fseek_file_func(voidpf opaque, voidpf stream, uLong offset, int origin) { int fseek_origin=0; long ret; + (void)opaque; switch (origin) { case ZLIB_FILEFUNC_SEEK_CUR : @@ -176,15 +163,15 @@ static long ZCALLBACK fseek_file_func (voidpf opaque, voidpf stream, uLong offs default: return -1; } ret = 0; - if (fseek((FILE *)stream, offset, fseek_origin) != 0) + if (fseek((FILE *)stream, (long)offset, fseek_origin) != 0) ret = -1; return ret; } -static long ZCALLBACK fseek64_file_func (voidpf opaque, voidpf stream, ZPOS64_T offset, int origin) -{ +static long ZCALLBACK fseek64_file_func(voidpf opaque, voidpf stream, ZPOS64_T offset, int origin) { int fseek_origin=0; long ret; + (void)opaque; switch (origin) { case ZLIB_FILEFUNC_SEEK_CUR : @@ -200,30 +187,28 @@ static long ZCALLBACK fseek64_file_func (voidpf opaque, voidpf stream, ZPOS64_T } ret = 0; - if(FSEEKO_FUNC((FILE *)stream, offset, fseek_origin) != 0) + if(FSEEKO_FUNC((FILE *)stream, (z_off64_t)offset, fseek_origin) != 0) ret = -1; return ret; } -static int ZCALLBACK fclose_file_func (voidpf opaque, voidpf stream) -{ +static int ZCALLBACK fclose_file_func(voidpf opaque, voidpf stream) { int ret; + (void)opaque; ret = fclose((FILE *)stream); return ret; } -static int ZCALLBACK ferror_file_func (voidpf opaque, voidpf stream) -{ +static int ZCALLBACK ferror_file_func(voidpf opaque, voidpf stream) { int ret; + (void)opaque; ret = ferror((FILE *)stream); return ret; } -void fill_fopen_filefunc (pzlib_filefunc_def) - zlib_filefunc_def* pzlib_filefunc_def; -{ +void fill_fopen_filefunc(zlib_filefunc_def* pzlib_filefunc_def) { pzlib_filefunc_def->zopen_file = fopen_file_func; pzlib_filefunc_def->zread_file = fread_file_func; pzlib_filefunc_def->zwrite_file = fwrite_file_func; @@ -234,8 +219,7 @@ void fill_fopen_filefunc (pzlib_filefunc_def) pzlib_filefunc_def->opaque = NULL; } -void fill_fopen64_filefunc (zlib_filefunc64_def* pzlib_filefunc_def) -{ +void fill_fopen64_filefunc(zlib_filefunc64_def* pzlib_filefunc_def) { pzlib_filefunc_def->zopen64_file = fopen64_file_func; pzlib_filefunc_def->zread_file = fread_file_func; pzlib_filefunc_def->zwrite_file = fwrite_file_func; diff --git a/zlib/contrib/minizip/ioapi.h b/zlib/contrib/minizip/ioapi.h index 8dcbdb06e35a..a2d2e6e60d92 100644 --- a/zlib/contrib/minizip/ioapi.h +++ b/zlib/contrib/minizip/ioapi.h @@ -50,7 +50,7 @@ #define ftello64 ftell #define fseeko64 fseek #else -#ifdef __FreeBSD__ +#if defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__) || defined(__HAIKU__) || defined(MINIZIP_FOPEN_NO_64) #define fopen64 fopen #define ftello64 ftello #define fseeko64 fseeko @@ -82,7 +82,7 @@ #include "mz64conf.h" #endif -/* a type choosen by DEFINE */ +/* a type chosen by DEFINE */ #ifdef HAVE_64BIT_INT_CUSTOM typedef 64BIT_INT_CUSTOM_TYPE ZPOS64_T; #else @@ -91,8 +91,7 @@ typedef 64BIT_INT_CUSTOM_TYPE ZPOS64_T; typedef uint64_t ZPOS64_T; #else -/* Maximum unsigned 32-bit value used as placeholder for zip64 */ -#define MAXU32 0xffffffff + #if defined(_MSC_VER) || defined(__BORLANDC__) typedef unsigned __int64 ZPOS64_T; @@ -102,7 +101,10 @@ typedef unsigned long long int ZPOS64_T; #endif #endif - +/* Maximum unsigned 32-bit value used as placeholder for zip64 */ +#ifndef MAXU32 +#define MAXU32 (0xffffffff) +#endif #ifdef __cplusplus extern "C" { @@ -132,17 +134,17 @@ extern "C" { -typedef voidpf (ZCALLBACK *open_file_func) OF((voidpf opaque, const char* filename, int mode)); -typedef uLong (ZCALLBACK *read_file_func) OF((voidpf opaque, voidpf stream, void* buf, uLong size)); -typedef uLong (ZCALLBACK *write_file_func) OF((voidpf opaque, voidpf stream, const void* buf, uLong size)); -typedef int (ZCALLBACK *close_file_func) OF((voidpf opaque, voidpf stream)); -typedef int (ZCALLBACK *testerror_file_func) OF((voidpf opaque, voidpf stream)); +typedef voidpf (ZCALLBACK *open_file_func) (voidpf opaque, const char* filename, int mode); +typedef uLong (ZCALLBACK *read_file_func) (voidpf opaque, voidpf stream, void* buf, uLong size); +typedef uLong (ZCALLBACK *write_file_func) (voidpf opaque, voidpf stream, const void* buf, uLong size); +typedef int (ZCALLBACK *close_file_func) (voidpf opaque, voidpf stream); +typedef int (ZCALLBACK *testerror_file_func) (voidpf opaque, voidpf stream); -typedef long (ZCALLBACK *tell_file_func) OF((voidpf opaque, voidpf stream)); -typedef long (ZCALLBACK *seek_file_func) OF((voidpf opaque, voidpf stream, uLong offset, int origin)); +typedef long (ZCALLBACK *tell_file_func) (voidpf opaque, voidpf stream); +typedef long (ZCALLBACK *seek_file_func) (voidpf opaque, voidpf stream, uLong offset, int origin); -/* here is the "old" 32 bits structure structure */ +/* here is the "old" 32 bits structure */ typedef struct zlib_filefunc_def_s { open_file_func zopen_file; @@ -155,9 +157,9 @@ typedef struct zlib_filefunc_def_s voidpf opaque; } zlib_filefunc_def; -typedef ZPOS64_T (ZCALLBACK *tell64_file_func) OF((voidpf opaque, voidpf stream)); -typedef long (ZCALLBACK *seek64_file_func) OF((voidpf opaque, voidpf stream, ZPOS64_T offset, int origin)); -typedef voidpf (ZCALLBACK *open64_file_func) OF((voidpf opaque, const void* filename, int mode)); +typedef ZPOS64_T (ZCALLBACK *tell64_file_func) (voidpf opaque, voidpf stream); +typedef long (ZCALLBACK *seek64_file_func) (voidpf opaque, voidpf stream, ZPOS64_T offset, int origin); +typedef voidpf (ZCALLBACK *open64_file_func) (voidpf opaque, const void* filename, int mode); typedef struct zlib_filefunc64_def_s { @@ -171,8 +173,8 @@ typedef struct zlib_filefunc64_def_s voidpf opaque; } zlib_filefunc64_def; -void fill_fopen64_filefunc OF((zlib_filefunc64_def* pzlib_filefunc_def)); -void fill_fopen_filefunc OF((zlib_filefunc_def* pzlib_filefunc_def)); +void fill_fopen64_filefunc(zlib_filefunc64_def* pzlib_filefunc_def); +void fill_fopen_filefunc(zlib_filefunc_def* pzlib_filefunc_def); /* now internal definition, only for zip.c and unzip.h */ typedef struct zlib_filefunc64_32_def_s @@ -191,11 +193,11 @@ typedef struct zlib_filefunc64_32_def_s #define ZCLOSE64(filefunc,filestream) ((*((filefunc).zfile_func64.zclose_file)) ((filefunc).zfile_func64.opaque,filestream)) #define ZERROR64(filefunc,filestream) ((*((filefunc).zfile_func64.zerror_file)) ((filefunc).zfile_func64.opaque,filestream)) -voidpf call_zopen64 OF((const zlib_filefunc64_32_def* pfilefunc,const void*filename,int mode)); -long call_zseek64 OF((const zlib_filefunc64_32_def* pfilefunc,voidpf filestream, ZPOS64_T offset, int origin)); -ZPOS64_T call_ztell64 OF((const zlib_filefunc64_32_def* pfilefunc,voidpf filestream)); +voidpf call_zopen64(const zlib_filefunc64_32_def* pfilefunc,const void*filename,int mode); +long call_zseek64(const zlib_filefunc64_32_def* pfilefunc,voidpf filestream, ZPOS64_T offset, int origin); +ZPOS64_T call_ztell64(const zlib_filefunc64_32_def* pfilefunc,voidpf filestream); -void fill_zlib_filefunc64_32_def_from_filefunc32(zlib_filefunc64_32_def* p_filefunc64_32,const zlib_filefunc_def* p_filefunc32); +void fill_zlib_filefunc64_32_def_from_filefunc32(zlib_filefunc64_32_def* p_filefunc64_32,const zlib_filefunc_def* p_filefunc32); #define ZOPEN64(filefunc,filename,mode) (call_zopen64((&(filefunc)),(filename),(mode))) #define ZTELL64(filefunc,filestream) (call_ztell64((&(filefunc)),(filestream))) diff --git a/zlib/contrib/minizip/iowin32.c b/zlib/contrib/minizip/iowin32.c index 274f39eb1dd2..08536e94b8a2 100644 --- a/zlib/contrib/minizip/iowin32.c +++ b/zlib/contrib/minizip/iowin32.c @@ -28,19 +28,16 @@ // see Include/shared/winapifamily.h in the Windows Kit #if defined(WINAPI_FAMILY_PARTITION) && (!(defined(IOWIN32_USING_WINRT_API))) + +#if !defined(WINAPI_FAMILY_ONE_PARTITION) +#define WINAPI_FAMILY_ONE_PARTITION(PartitionSet, Partition) ((WINAPI_FAMILY & PartitionSet) == Partition) +#endif + #if WINAPI_FAMILY_ONE_PARTITION(WINAPI_FAMILY, WINAPI_PARTITION_APP) #define IOWIN32_USING_WINRT_API 1 #endif #endif -voidpf ZCALLBACK win32_open_file_func OF((voidpf opaque, const char* filename, int mode)); -uLong ZCALLBACK win32_read_file_func OF((voidpf opaque, voidpf stream, void* buf, uLong size)); -uLong ZCALLBACK win32_write_file_func OF((voidpf opaque, voidpf stream, const void* buf, uLong size)); -ZPOS64_T ZCALLBACK win32_tell64_file_func OF((voidpf opaque, voidpf stream)); -long ZCALLBACK win32_seek64_file_func OF((voidpf opaque, voidpf stream, ZPOS64_T offset, int origin)); -int ZCALLBACK win32_close_file_func OF((voidpf opaque, voidpf stream)); -int ZCALLBACK win32_error_file_func OF((voidpf opaque, voidpf stream)); - typedef struct { HANDLE hf; @@ -52,8 +49,7 @@ static void win32_translate_open_mode(int mode, DWORD* lpdwDesiredAccess, DWORD* lpdwCreationDisposition, DWORD* lpdwShareMode, - DWORD* lpdwFlagsAndAttributes) -{ + DWORD* lpdwFlagsAndAttributes) { *lpdwDesiredAccess = *lpdwShareMode = *lpdwFlagsAndAttributes = *lpdwCreationDisposition = 0; if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER)==ZLIB_FILEFUNC_MODE_READ) @@ -74,8 +70,7 @@ static void win32_translate_open_mode(int mode, } } -static voidpf win32_build_iowin(HANDLE hFile) -{ +static voidpf win32_build_iowin(HANDLE hFile) { voidpf ret=NULL; if ((hFile != NULL) && (hFile != INVALID_HANDLE_VALUE)) @@ -93,8 +88,7 @@ static voidpf win32_build_iowin(HANDLE hFile) return ret; } -voidpf ZCALLBACK win32_open64_file_func (voidpf opaque,const void* filename,int mode) -{ +voidpf ZCALLBACK win32_open64_file_func(voidpf opaque, const void* filename, int mode) { const char* mode_fopen = NULL; DWORD dwDesiredAccess,dwCreationDisposition,dwShareMode,dwFlagsAndAttributes ; HANDLE hFile = NULL; @@ -122,8 +116,7 @@ voidpf ZCALLBACK win32_open64_file_func (voidpf opaque,const void* filename,int } -voidpf ZCALLBACK win32_open64_file_funcA (voidpf opaque,const void* filename,int mode) -{ +voidpf ZCALLBACK win32_open64_file_funcA(voidpf opaque, const void* filename, int mode) { const char* mode_fopen = NULL; DWORD dwDesiredAccess,dwCreationDisposition,dwShareMode,dwFlagsAndAttributes ; HANDLE hFile = NULL; @@ -146,8 +139,7 @@ voidpf ZCALLBACK win32_open64_file_funcA (voidpf opaque,const void* filename,int } -voidpf ZCALLBACK win32_open64_file_funcW (voidpf opaque,const void* filename,int mode) -{ +voidpf ZCALLBACK win32_open64_file_funcW(voidpf opaque, const void* filename, int mode) { const char* mode_fopen = NULL; DWORD dwDesiredAccess,dwCreationDisposition,dwShareMode,dwFlagsAndAttributes ; HANDLE hFile = NULL; @@ -166,8 +158,7 @@ voidpf ZCALLBACK win32_open64_file_funcW (voidpf opaque,const void* filename,int } -voidpf ZCALLBACK win32_open_file_func (voidpf opaque,const char* filename,int mode) -{ +voidpf ZCALLBACK win32_open_file_func(voidpf opaque, const char* filename, int mode) { const char* mode_fopen = NULL; DWORD dwDesiredAccess,dwCreationDisposition,dwShareMode,dwFlagsAndAttributes ; HANDLE hFile = NULL; @@ -195,8 +186,7 @@ voidpf ZCALLBACK win32_open_file_func (voidpf opaque,const char* filename,int mo } -uLong ZCALLBACK win32_read_file_func (voidpf opaque, voidpf stream, void* buf,uLong size) -{ +uLong ZCALLBACK win32_read_file_func(voidpf opaque, voidpf stream, void* buf,uLong size) { uLong ret=0; HANDLE hFile = NULL; if (stream!=NULL) @@ -217,8 +207,7 @@ uLong ZCALLBACK win32_read_file_func (voidpf opaque, voidpf stream, void* buf,uL } -uLong ZCALLBACK win32_write_file_func (voidpf opaque,voidpf stream,const void* buf,uLong size) -{ +uLong ZCALLBACK win32_write_file_func(voidpf opaque, voidpf stream, const void* buf, uLong size) { uLong ret=0; HANDLE hFile = NULL; if (stream!=NULL) @@ -238,8 +227,7 @@ uLong ZCALLBACK win32_write_file_func (voidpf opaque,voidpf stream,const void* b return ret; } -static BOOL MySetFilePointerEx(HANDLE hFile, LARGE_INTEGER pos, LARGE_INTEGER *newPos, DWORD dwMoveMethod) -{ +static BOOL MySetFilePointerEx(HANDLE hFile, LARGE_INTEGER pos, LARGE_INTEGER *newPos, DWORD dwMoveMethod) { #ifdef IOWIN32_USING_WINRT_API return SetFilePointerEx(hFile, pos, newPos, dwMoveMethod); #else @@ -258,8 +246,7 @@ static BOOL MySetFilePointerEx(HANDLE hFile, LARGE_INTEGER pos, LARGE_INTEGER *n #endif } -long ZCALLBACK win32_tell_file_func (voidpf opaque,voidpf stream) -{ +long ZCALLBACK win32_tell_file_func(voidpf opaque, voidpf stream) { long ret=-1; HANDLE hFile = NULL; if (stream!=NULL) @@ -281,8 +268,7 @@ long ZCALLBACK win32_tell_file_func (voidpf opaque,voidpf stream) return ret; } -ZPOS64_T ZCALLBACK win32_tell64_file_func (voidpf opaque, voidpf stream) -{ +ZPOS64_T ZCALLBACK win32_tell64_file_func(voidpf opaque, voidpf stream) { ZPOS64_T ret= (ZPOS64_T)-1; HANDLE hFile = NULL; if (stream!=NULL) @@ -306,8 +292,7 @@ ZPOS64_T ZCALLBACK win32_tell64_file_func (voidpf opaque, voidpf stream) } -long ZCALLBACK win32_seek_file_func (voidpf opaque,voidpf stream,uLong offset,int origin) -{ +long ZCALLBACK win32_seek_file_func(voidpf opaque, voidpf stream, uLong offset, int origin) { DWORD dwMoveMethod=0xFFFFFFFF; HANDLE hFile = NULL; @@ -344,8 +329,7 @@ long ZCALLBACK win32_seek_file_func (voidpf opaque,voidpf stream,uLong offset,in return ret; } -long ZCALLBACK win32_seek64_file_func (voidpf opaque, voidpf stream,ZPOS64_T offset,int origin) -{ +long ZCALLBACK win32_seek64_file_func(voidpf opaque, voidpf stream, ZPOS64_T offset, int origin) { DWORD dwMoveMethod=0xFFFFFFFF; HANDLE hFile = NULL; long ret=-1; @@ -383,8 +367,7 @@ long ZCALLBACK win32_seek64_file_func (voidpf opaque, voidpf stream,ZPOS64_T off return ret; } -int ZCALLBACK win32_close_file_func (voidpf opaque, voidpf stream) -{ +int ZCALLBACK win32_close_file_func(voidpf opaque, voidpf stream) { int ret=-1; if (stream!=NULL) @@ -401,8 +384,7 @@ int ZCALLBACK win32_close_file_func (voidpf opaque, voidpf stream) return ret; } -int ZCALLBACK win32_error_file_func (voidpf opaque,voidpf stream) -{ +int ZCALLBACK win32_error_file_func(voidpf opaque, voidpf stream) { int ret=-1; if (stream!=NULL) { @@ -411,8 +393,7 @@ int ZCALLBACK win32_error_file_func (voidpf opaque,voidpf stream) return ret; } -void fill_win32_filefunc (zlib_filefunc_def* pzlib_filefunc_def) -{ +void fill_win32_filefunc(zlib_filefunc_def* pzlib_filefunc_def) { pzlib_filefunc_def->zopen_file = win32_open_file_func; pzlib_filefunc_def->zread_file = win32_read_file_func; pzlib_filefunc_def->zwrite_file = win32_write_file_func; @@ -423,8 +404,7 @@ void fill_win32_filefunc (zlib_filefunc_def* pzlib_filefunc_def) pzlib_filefunc_def->opaque = NULL; } -void fill_win32_filefunc64(zlib_filefunc64_def* pzlib_filefunc_def) -{ +void fill_win32_filefunc64(zlib_filefunc64_def* pzlib_filefunc_def) { pzlib_filefunc_def->zopen64_file = win32_open64_file_func; pzlib_filefunc_def->zread_file = win32_read_file_func; pzlib_filefunc_def->zwrite_file = win32_write_file_func; @@ -436,8 +416,7 @@ void fill_win32_filefunc64(zlib_filefunc64_def* pzlib_filefunc_def) } -void fill_win32_filefunc64A(zlib_filefunc64_def* pzlib_filefunc_def) -{ +void fill_win32_filefunc64A(zlib_filefunc64_def* pzlib_filefunc_def) { pzlib_filefunc_def->zopen64_file = win32_open64_file_funcA; pzlib_filefunc_def->zread_file = win32_read_file_func; pzlib_filefunc_def->zwrite_file = win32_write_file_func; @@ -449,8 +428,7 @@ void fill_win32_filefunc64A(zlib_filefunc64_def* pzlib_filefunc_def) } -void fill_win32_filefunc64W(zlib_filefunc64_def* pzlib_filefunc_def) -{ +void fill_win32_filefunc64W(zlib_filefunc64_def* pzlib_filefunc_def) { pzlib_filefunc_def->zopen64_file = win32_open64_file_funcW; pzlib_filefunc_def->zread_file = win32_read_file_func; pzlib_filefunc_def->zwrite_file = win32_write_file_func; diff --git a/zlib/contrib/minizip/iowin32.h b/zlib/contrib/minizip/iowin32.h index 0ca0969a7d09..a23a65d4331d 100644 --- a/zlib/contrib/minizip/iowin32.h +++ b/zlib/contrib/minizip/iowin32.h @@ -18,10 +18,10 @@ extern "C" { #endif -void fill_win32_filefunc OF((zlib_filefunc_def* pzlib_filefunc_def)); -void fill_win32_filefunc64 OF((zlib_filefunc64_def* pzlib_filefunc_def)); -void fill_win32_filefunc64A OF((zlib_filefunc64_def* pzlib_filefunc_def)); -void fill_win32_filefunc64W OF((zlib_filefunc64_def* pzlib_filefunc_def)); +void fill_win32_filefunc(zlib_filefunc_def* pzlib_filefunc_def); +void fill_win32_filefunc64(zlib_filefunc64_def* pzlib_filefunc_def); +void fill_win32_filefunc64A(zlib_filefunc64_def* pzlib_filefunc_def); +void fill_win32_filefunc64W(zlib_filefunc64_def* pzlib_filefunc_def); #ifdef __cplusplus } diff --git a/zlib/contrib/minizip/miniunz.c b/zlib/contrib/minizip/miniunz.c index 3d65401be5cd..d627c4226bc9 100644 --- a/zlib/contrib/minizip/miniunz.c +++ b/zlib/contrib/minizip/miniunz.c @@ -27,7 +27,7 @@ #endif #endif -#ifdef __APPLE__ +#if defined(__APPLE__) || defined(__HAIKU__) || defined(MINIZIP_FOPEN_NO_64) // In darwin and perhaps other BSD variants off_t is a 64 bit value, hence no need for specific 64 bit functions #define FOPEN_FUNC(filename, mode) fopen(filename, mode) #define FTELLO_FUNC(stream) ftello(stream) @@ -45,6 +45,7 @@ #include #include #include +#include #ifdef _WIN32 # include @@ -78,13 +79,9 @@ /* change_file_date : change the date/time of a file filename : the filename of the file where date/time must be modified - dosdate : the new date at the MSDos format (4 bytes) + dosdate : the new date at the MSDOS format (4 bytes) tmu_date : the SAME new date at the tm_unz format */ -void change_file_date(filename,dosdate,tmu_date) - const char *filename; - uLong dosdate; - tm_unz tmu_date; -{ +static void change_file_date(const char *filename, uLong dosdate, tm_unz tmu_date) { #ifdef _WIN32 HANDLE hFile; FILETIME ftm,ftLocal,ftCreate,ftLastAcc,ftLastWrite; @@ -97,7 +94,8 @@ void change_file_date(filename,dosdate,tmu_date) SetFileTime(hFile,&ftm,&ftLastAcc,&ftm); CloseHandle(hFile); #else -#ifdef unix || __APPLE__ +#if defined(unix) || defined(__APPLE__) + (void)dosdate; struct utimbuf ut; struct tm newdate; newdate.tm_sec = tmu_date.tm_sec; @@ -113,6 +111,10 @@ void change_file_date(filename,dosdate,tmu_date) ut.actime=ut.modtime=mktime(&newdate); utime(filename,&ut); +#else + (void)filename; + (void)dosdate; + (void)tmu_date; #endif #endif } @@ -121,9 +123,7 @@ void change_file_date(filename,dosdate,tmu_date) /* mymkdir and change_file_date are not 100 % portable As I don't know well Unix, I wait feedback for the unix portion */ -int mymkdir(dirname) - const char* dirname; -{ +static int mymkdir(const char* dirname) { int ret=0; #ifdef _WIN32 ret = _mkdir(dirname); @@ -131,18 +131,18 @@ int mymkdir(dirname) ret = mkdir (dirname,0775); #elif __APPLE__ ret = mkdir (dirname,0775); +#else + (void)dirname; #endif return ret; } -int makedir (newdir) - char *newdir; -{ +static int makedir(const char *newdir) { char *buffer ; char *p; - int len = (int)strlen(newdir); + size_t len = strlen(newdir); - if (len <= 0) + if (len == 0) return 0; buffer = (char*)malloc(len+1); @@ -185,14 +185,12 @@ int makedir (newdir) return 1; } -void do_banner() -{ - printf("MiniUnz 1.01b, demo of zLib + Unz package written by Gilles Vollant\n"); +static void do_banner(void) { + printf("MiniUnz 1.1, demo of zLib + Unz package written by Gilles Vollant\n"); printf("more info at http://www.winimage.com/zLibDll/unzip.html\n\n"); } -void do_help() -{ +static void do_help(void) { printf("Usage : miniunz [-e] [-x] [-v] [-l] [-o] [-p password] file.zip [file_to_extr.] [-d extractdir]\n\n" \ " -e Extract without pathname (junk paths)\n" \ " -x Extract with pathname\n" \ @@ -200,11 +198,10 @@ void do_help() " -l list files\n" \ " -d directory to extract into\n" \ " -o overwrite files without prompting\n" \ - " -p extract crypted file using password\n\n"); + " -p extract encrypted file using password\n\n"); } -void Display64BitsSize(ZPOS64_T n, int size_char) -{ +static void Display64BitsSize(ZPOS64_T n, int size_char) { /* to avoid compatibility problem , we do here the conversion */ char number[21]; int offset=19; @@ -231,9 +228,7 @@ void Display64BitsSize(ZPOS64_T n, int size_char) printf("%s",&number[pos_string]); } -int do_list(uf) - unzFile uf; -{ +static int do_list(unzFile uf) { uLong i; unz_global_info64 gi; int err; @@ -248,7 +243,7 @@ int do_list(uf) char filename_inzip[256]; unz_file_info64 file_info; uLong ratio=0; - const char *string_method; + const char *string_method = ""; char charCrypt=' '; err = unzGetCurrentFileInfo64(uf,&file_info,filename_inzip,sizeof(filename_inzip),NULL,0,NULL,0); if (err!=UNZ_OK) @@ -259,7 +254,7 @@ int do_list(uf) if (file_info.uncompressed_size>0) ratio = (uLong)((file_info.compressed_size*100)/file_info.uncompressed_size); - /* display a '*' if the file is crypted */ + /* display a '*' if the file is encrypted */ if ((file_info.flag & 1) != 0) charCrypt='*'; @@ -309,12 +304,7 @@ int do_list(uf) } -int do_extract_currentfile(uf,popt_extract_without_path,popt_overwrite,password) - unzFile uf; - const int* popt_extract_without_path; - int* popt_overwrite; - const char* password; -{ +static int do_extract_currentfile(unzFile uf, const int* popt_extract_without_path, int* popt_overwrite, const char* password) { char filename_inzip[256]; char* filename_withoutpath; char* p; @@ -324,7 +314,6 @@ int do_extract_currentfile(uf,popt_extract_without_path,popt_overwrite,password) uInt size_buf; unz_file_info64 file_info; - uLong ratio=0; err = unzGetCurrentFileInfo64(uf,&file_info,filename_inzip,sizeof(filename_inzip),NULL,0,NULL,0); if (err!=UNZ_OK) @@ -367,6 +356,20 @@ int do_extract_currentfile(uf,popt_extract_without_path,popt_overwrite,password) else write_filename = filename_withoutpath; + if (write_filename[0]!='\0') + { + const char* relative_check = write_filename; + while (relative_check[1]!='\0') + { + if (relative_check[0]=='.' && relative_check[1]=='.') + write_filename = relative_check; + relative_check++; + } + } + + while (write_filename[0]=='/' || write_filename[0]=='.') + write_filename++; + err = unzOpenCurrentFilePassword(uf,password); if (err!=UNZ_OK) { @@ -439,7 +442,7 @@ int do_extract_currentfile(uf,popt_extract_without_path,popt_overwrite,password) break; } if (err>0) - if (fwrite(buf,err,1,fout)!=1) + if (fwrite(buf,(unsigned)err,1,fout)!=1) { printf("error in writing extracted file\n"); err=UNZ_ERRNO; @@ -472,16 +475,10 @@ int do_extract_currentfile(uf,popt_extract_without_path,popt_overwrite,password) } -int do_extract(uf,opt_extract_without_path,opt_overwrite,password) - unzFile uf; - int opt_extract_without_path; - int opt_overwrite; - const char* password; -{ +static int do_extract(unzFile uf, int opt_extract_without_path, int opt_overwrite, const char* password) { uLong i; unz_global_info64 gi; int err; - FILE* fout=NULL; err = unzGetGlobalInfo64(uf,&gi); if (err!=UNZ_OK) @@ -508,14 +505,7 @@ int do_extract(uf,opt_extract_without_path,opt_overwrite,password) return 0; } -int do_extract_onefile(uf,filename,opt_extract_without_path,opt_overwrite,password) - unzFile uf; - const char* filename; - int opt_extract_without_path; - int opt_overwrite; - const char* password; -{ - int err = UNZ_OK; +static int do_extract_onefile(unzFile uf, const char* filename, int opt_extract_without_path, int opt_overwrite, const char* password) { if (unzLocateFile(uf,filename,CASESENSITIVITY)!=UNZ_OK) { printf("file %s not found in the zipfile\n",filename); @@ -531,10 +521,7 @@ int do_extract_onefile(uf,filename,opt_extract_without_path,opt_overwrite,passwo } -int main(argc,argv) - int argc; - char *argv[]; -{ +int main(int argc, char *argv[]) { const char *zipfilename=NULL; const char *filename_to_extract=NULL; const char *password=NULL; @@ -565,7 +552,7 @@ int main(argc,argv) while ((*p)!='\0') { - char c=*(p++);; + char c=*(p++); if ((c=='l') || (c=='L')) opt_do_list = 1; if ((c=='v') || (c=='V')) @@ -607,7 +594,7 @@ int main(argc,argv) # endif strncpy(filename_try, zipfilename,MAXFILENAME-1); - /* strncpy doesnt append the trailing NULL, of the string is too long. */ + /* strncpy doesn't append the trailing NULL, of the string is too long. */ filename_try[ MAXFILENAME ] = '\0'; # ifdef USEWIN32IOAPI diff --git a/zlib/contrib/minizip/minizip.c b/zlib/contrib/minizip/minizip.c index 4288962ecef0..26ee8d029efe 100644 --- a/zlib/contrib/minizip/minizip.c +++ b/zlib/contrib/minizip/minizip.c @@ -28,7 +28,7 @@ #endif #endif -#ifdef __APPLE__ +#if defined(__APPLE__) || defined(__HAIKU__) || defined(MINIZIP_FOPEN_NO_64) // In darwin and perhaps other BSD variants off_t is a 64 bit value, hence no need for specific 64 bit functions #define FOPEN_FUNC(filename, mode) fopen(filename, mode) #define FTELLO_FUNC(stream) ftello(stream) @@ -71,11 +71,9 @@ #define MAXFILENAME (256) #ifdef _WIN32 -uLong filetime(f, tmzip, dt) - char *f; /* name of file to get info on */ - tm_zip *tmzip; /* return value: access, modific. and creation times */ - uLong *dt; /* dostime */ -{ +/* f: name of file to get info on, tmzip: return value: access, + modification and creation times, dt: dostime */ +static int filetime(const char *f, tm_zip *tmzip, uLong *dt) { int ret = 0; { FILETIME ftLocal; @@ -94,12 +92,11 @@ uLong filetime(f, tmzip, dt) return ret; } #else -#ifdef unix || __APPLE__ -uLong filetime(f, tmzip, dt) - char *f; /* name of file to get info on */ - tm_zip *tmzip; /* return value: access, modific. and creation times */ - uLong *dt; /* dostime */ -{ +#if defined(unix) || defined(__APPLE__) +/* f: name of file to get info on, tmzip: return value: access, + modification and creation times, dt: dostime */ +static int filetime(const char *f, tm_zip *tmzip, uLong *dt) { + (void)dt; int ret=0; struct stat s; /* results of stat() */ struct tm* filedate; @@ -108,12 +105,12 @@ uLong filetime(f, tmzip, dt) if (strcmp(f,"-")!=0) { char name[MAXFILENAME+1]; - int len = strlen(f); + size_t len = strlen(f); if (len > MAXFILENAME) len = MAXFILENAME; strncpy(name, f,MAXFILENAME-1); - /* strncpy doesnt append the trailing NULL, of the string is too long. */ + /* strncpy doesn't append the trailing NULL, of the string is too long. */ name[ MAXFILENAME ] = '\0'; if (name[len - 1] == '/') @@ -137,11 +134,12 @@ uLong filetime(f, tmzip, dt) return ret; } #else -uLong filetime(f, tmzip, dt) - char *f; /* name of file to get info on */ - tm_zip *tmzip; /* return value: access, modific. and creation times */ - uLong *dt; /* dostime */ -{ +/* f: name of file to get info on, tmzip: return value: access, + modification and creation times, dt: dostime */ +static int filetime(const char *f, tm_zip *tmzip, uLong *dt) { + (void)f; + (void)tmzip; + (void)dt; return 0; } #endif @@ -150,9 +148,7 @@ uLong filetime(f, tmzip, dt) -int check_exist_file(filename) - const char* filename; -{ +static int check_exist_file(const char* filename) { FILE* ftestexist; int ret = 1; ftestexist = FOPEN_FUNC(filename,"rb"); @@ -163,14 +159,12 @@ int check_exist_file(filename) return ret; } -void do_banner() -{ +static void do_banner(void) { printf("MiniZip 1.1, demo of zLib + MiniZip64 package, written by Gilles Vollant\n"); printf("more info on MiniZip at http://www.winimage.com/zLibDll/minizip.html\n\n"); } -void do_help() -{ +static void do_help(void) { printf("Usage : minizip [-o] [-a] [-0 to -9] [-p password] [-j] file.zip [files_to_add]\n\n" \ " -o Overwrite existing file.zip\n" \ " -a Append to existing file.zip\n" \ @@ -182,14 +176,13 @@ void do_help() /* calculate the CRC32 of a file, because to encrypt a file, we need known the CRC32 of the file before */ -int getFileCrc(const char* filenameinzip,void*buf,unsigned long size_buf,unsigned long* result_crc) -{ +static int getFileCrc(const char* filenameinzip, void* buf, unsigned long size_buf, unsigned long* result_crc) { unsigned long calculate_crc=0; int err=ZIP_OK; FILE * fin = FOPEN_FUNC(filenameinzip,"rb"); unsigned long size_read = 0; - unsigned long total_read = 0; + /* unsigned long total_read = 0; */ if (fin==NULL) { err = ZIP_ERRNO; @@ -199,7 +192,7 @@ int getFileCrc(const char* filenameinzip,void*buf,unsigned long size_buf,unsigne do { err = ZIP_OK; - size_read = (int)fread(buf,1,size_buf,fin); + size_read = fread(buf,1,size_buf,fin); if (size_read < size_buf) if (feof(fin)==0) { @@ -208,8 +201,8 @@ int getFileCrc(const char* filenameinzip,void*buf,unsigned long size_buf,unsigne } if (size_read>0) - calculate_crc = crc32(calculate_crc,buf,size_read); - total_read += size_read; + calculate_crc = crc32_z(calculate_crc,buf,size_read); + /* total_read += size_read; */ } while ((err == ZIP_OK) && (size_read>0)); @@ -221,18 +214,17 @@ int getFileCrc(const char* filenameinzip,void*buf,unsigned long size_buf,unsigne return err; } -int isLargeFile(const char* filename) -{ +static int isLargeFile(const char* filename) { int largeFile = 0; ZPOS64_T pos = 0; FILE* pFile = FOPEN_FUNC(filename, "rb"); if(pFile != NULL) { - int n = FSEEKO_FUNC(pFile, 0, SEEK_END); - pos = FTELLO_FUNC(pFile); + FSEEKO_FUNC(pFile, 0, SEEK_END); + pos = (ZPOS64_T)FTELLO_FUNC(pFile); - printf("File : %s is %lld bytes\n", filename, pos); + printf("File : %s is %llu bytes\n", filename, pos); if(pos >= 0xffffffff) largeFile = 1; @@ -243,10 +235,7 @@ int isLargeFile(const char* filename) return largeFile; } -int main(argc,argv) - int argc; - char *argv[]; -{ +int main(int argc, char *argv[]) { int i; int opt_overwrite=0; int opt_compress_level=Z_DEFAULT_COMPRESSION; @@ -255,7 +244,7 @@ int main(argc,argv) char filename_try[MAXFILENAME+16]; int zipok; int err=0; - int size_buf=0; + size_t size_buf=0; void* buf=NULL; const char* password=NULL; @@ -276,7 +265,7 @@ int main(argc,argv) while ((*p)!='\0') { - char c=*(p++);; + char c=*(p++); if ((c=='o') || (c=='O')) opt_overwrite = 1; if ((c=='a') || (c=='A')) @@ -322,7 +311,7 @@ int main(argc,argv) zipok = 1 ; strncpy(filename_try, argv[zipfilenamearg],MAXFILENAME-1); - /* strncpy doesnt append the trailing NULL, of the string is too long. */ + /* strncpy doesn't append the trailing NULL, of the string is too long. */ filename_try[ MAXFILENAME ] = '\0'; len=(int)strlen(filename_try); @@ -392,11 +381,11 @@ int main(argc,argv) ((argv[i][1]=='o') || (argv[i][1]=='O') || (argv[i][1]=='a') || (argv[i][1]=='A') || (argv[i][1]=='p') || (argv[i][1]=='P') || - ((argv[i][1]>='0') || (argv[i][1]<='9'))) && + ((argv[i][1]>='0') && (argv[i][1]<='9'))) && (strlen(argv[i]) == 2))) { - FILE * fin; - int size_read; + FILE * fin = NULL; + size_t size_read; const char* filenameinzip = argv[i]; const char *savefilenameinzip; zip_fileinfo zi; @@ -472,7 +461,7 @@ int main(argc,argv) do { err = ZIP_OK; - size_read = (int)fread(buf,1,size_buf,fin); + size_read = fread(buf,1,size_buf,fin); if (size_read < size_buf) if (feof(fin)==0) { @@ -482,7 +471,7 @@ int main(argc,argv) if (size_read>0) { - err = zipWriteInFileInZip (zf,buf,size_read); + err = zipWriteInFileInZip (zf,buf,(unsigned)size_read); if (err<0) { printf("error in writing %s in the zipfile\n", diff --git a/zlib/contrib/minizip/mztools.c b/zlib/contrib/minizip/mztools.c index 96891c2e0b71..c8d237561557 100644 --- a/zlib/contrib/minizip/mztools.c +++ b/zlib/contrib/minizip/mztools.c @@ -27,13 +27,7 @@ WRITE_16((unsigned char*)(buff) + 2, (n) >> 16); \ } while(0) -extern int ZEXPORT unzRepair(file, fileOut, fileOutTmp, nRecovered, bytesRecovered) -const char* file; -const char* fileOut; -const char* fileOutTmp; -uLong* nRecovered; -uLong* bytesRecovered; -{ +extern int ZEXPORT unzRepair(const char* file, const char* fileOut, const char* fileOutTmp, uLong* nRecovered, uLong* bytesRecovered) { int err = Z_OK; FILE* fpZip = fopen(file, "rb"); FILE* fpOut = fopen(fileOut, "wb"); diff --git a/zlib/contrib/minizip/unzip.c b/zlib/contrib/minizip/unzip.c index bcfb9416ec35..ea05b7d62a07 100644 --- a/zlib/contrib/minizip/unzip.c +++ b/zlib/contrib/minizip/unzip.c @@ -49,12 +49,12 @@ Copyright (C) 2007-2008 Even Rouault - Oct-2009 - Mathias Svensson - Removed cpl_* from symbol names (Even Rouault added them but since this is now moved to a new project (minizip64) I renamed them again). + Oct-2009 - Mathias Svensson - Removed cpl_* from symbol names (Even Rouault added them but since this is now moved to a new project (minizip64) I renamed them again). Oct-2009 - Mathias Svensson - Fixed problem if uncompressed size was > 4G and compressed size was <4G should only read the compressed/uncompressed size from the Zip64 format if the size from normal header was 0xFFFFFFFF - Oct-2009 - Mathias Svensson - Applied some bug fixes from paches recived from Gilles Vollant - Oct-2009 - Mathias Svensson - Applied support to unzip files with compression mathod BZIP2 (bzip2 lib is required) + Oct-2009 - Mathias Svensson - Applied some bug fixes from patches received from Gilles Vollant + Oct-2009 - Mathias Svensson - Applied support to unzip files with compression method BZIP2 (bzip2 lib is required) Patch created by Daniel Borca Jan-2010 - back to unzip and minizip 1.0 name scheme, with compatibility layer @@ -77,8 +77,6 @@ #ifdef STDC # include -# include -# include #endif #ifdef NO_ERRNO_H extern int errno; @@ -111,9 +109,6 @@ #ifndef ALLOC # define ALLOC(size) (malloc(size)) #endif -#ifndef TRYFREE -# define TRYFREE(p) {if (p) free(p);} -#endif #define SIZECENTRALDIRITEM (0x2e) #define SIZEZIPLOCALHEADER (0x1e) @@ -122,7 +117,7 @@ const char unz_copyright[] = " unzip 1.01 Copyright 1998-2004 Gilles Vollant - http://www.winimage.com/zLibDll"; -/* unz_file_info_interntal contain internal info about a file in zipfile*/ +/* unz_file_info64_internal contain internal info about a file in zipfile*/ typedef struct unz_file_info64_internal_s { ZPOS64_T offset_curfile;/* relative offset of local header 8 bytes */ @@ -153,7 +148,7 @@ typedef struct ZPOS64_T rest_read_compressed; /* number of byte to be decompressed */ ZPOS64_T rest_read_uncompressed;/*number of byte to be obtained after decomp*/ zlib_filefunc64_32_def z_filefunc; - voidpf filestream; /* io structore of the zipfile */ + voidpf filestream; /* io structure of the zipfile */ uLong compression_method; /* compression method (0==store) */ ZPOS64_T byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/ int raw; @@ -166,7 +161,7 @@ typedef struct { zlib_filefunc64_32_def z_filefunc; int is64bitOpenFunction; - voidpf filestream; /* io structore of the zipfile */ + voidpf filestream; /* io structure of the zipfile */ unz_global_info64 gi; /* public global information */ ZPOS64_T byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/ ZPOS64_T num_file; /* number of the current file in the zipfile*/ @@ -197,29 +192,24 @@ typedef struct #include "crypt.h" #endif + /* =========================================================================== - Read a byte from a gz_stream; update next_in and avail_in. Return EOF - for end of file. - IN assertion: the stream s has been successfully opened for reading. + Reads a long in LSB order from the given gz_stream. Sets */ - -local int unz64local_getByte OF(( - const zlib_filefunc64_32_def* pzlib_filefunc_def, - voidpf filestream, - int *pi)); - -local int unz64local_getByte(const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, int *pi) -{ - unsigned char c; - int err = (int)ZREAD64(*pzlib_filefunc_def,filestream,&c,1); - if (err==1) +local int unz64local_getShort(const zlib_filefunc64_32_def* pzlib_filefunc_def, + voidpf filestream, + uLong *pX) { + unsigned char c[2]; + int err = (int)ZREAD64(*pzlib_filefunc_def,filestream,c,2); + if (err==2) { - *pi = (int)c; + *pX = c[0] | ((uLong)c[1] << 8); return UNZ_OK; } else { + *pX = 0; if (ZERROR64(*pzlib_filefunc_def,filestream)) return UNZ_ERRNO; else @@ -227,127 +217,50 @@ local int unz64local_getByte(const zlib_filefunc64_32_def* pzlib_filefunc_def, v } } - -/* =========================================================================== - Reads a long in LSB order from the given gz_stream. Sets -*/ -local int unz64local_getShort OF(( - const zlib_filefunc64_32_def* pzlib_filefunc_def, - voidpf filestream, - uLong *pX)); - -local int unz64local_getShort (const zlib_filefunc64_32_def* pzlib_filefunc_def, +local int unz64local_getLong(const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, - uLong *pX) -{ - uLong x ; - int i = 0; - int err; - - err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); - x = (uLong)i; - - if (err==UNZ_OK) - err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); - x |= ((uLong)i)<<8; - - if (err==UNZ_OK) - *pX = x; - else - *pX = 0; - return err; -} - -local int unz64local_getLong OF(( - const zlib_filefunc64_32_def* pzlib_filefunc_def, - voidpf filestream, - uLong *pX)); - -local int unz64local_getLong (const zlib_filefunc64_32_def* pzlib_filefunc_def, - voidpf filestream, - uLong *pX) -{ - uLong x ; - int i = 0; - int err; - - err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); - x = (uLong)i; - - if (err==UNZ_OK) - err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); - x |= ((uLong)i)<<8; - - if (err==UNZ_OK) - err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); - x |= ((uLong)i)<<16; - - if (err==UNZ_OK) - err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); - x += ((uLong)i)<<24; - - if (err==UNZ_OK) - *pX = x; + uLong *pX) { + unsigned char c[4]; + int err = (int)ZREAD64(*pzlib_filefunc_def,filestream,c,4); + if (err==4) + { + *pX = c[0] | ((uLong)c[1] << 8) | ((uLong)c[2] << 16) | ((uLong)c[3] << 24); + return UNZ_OK; + } else + { *pX = 0; - return err; + if (ZERROR64(*pzlib_filefunc_def,filestream)) + return UNZ_ERRNO; + else + return UNZ_EOF; + } } -local int unz64local_getLong64 OF(( - const zlib_filefunc64_32_def* pzlib_filefunc_def, - voidpf filestream, - ZPOS64_T *pX)); - - -local int unz64local_getLong64 (const zlib_filefunc64_32_def* pzlib_filefunc_def, - voidpf filestream, - ZPOS64_T *pX) -{ - ZPOS64_T x ; - int i = 0; - int err; - - err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); - x = (ZPOS64_T)i; - - if (err==UNZ_OK) - err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); - x |= ((ZPOS64_T)i)<<8; - - if (err==UNZ_OK) - err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); - x |= ((ZPOS64_T)i)<<16; - - if (err==UNZ_OK) - err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); - x |= ((ZPOS64_T)i)<<24; - - if (err==UNZ_OK) - err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); - x |= ((ZPOS64_T)i)<<32; - - if (err==UNZ_OK) - err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); - x |= ((ZPOS64_T)i)<<40; - if (err==UNZ_OK) - err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); - x |= ((ZPOS64_T)i)<<48; - - if (err==UNZ_OK) - err = unz64local_getByte(pzlib_filefunc_def,filestream,&i); - x |= ((ZPOS64_T)i)<<56; - - if (err==UNZ_OK) - *pX = x; +local int unz64local_getLong64(const zlib_filefunc64_32_def* pzlib_filefunc_def, + voidpf filestream, + ZPOS64_T *pX) { + unsigned char c[8]; + int err = (int)ZREAD64(*pzlib_filefunc_def,filestream,c,8); + if (err==8) + { + *pX = c[0] | ((ZPOS64_T)c[1] << 8) | ((ZPOS64_T)c[2] << 16) | ((ZPOS64_T)c[3] << 24) + | ((ZPOS64_T)c[4] << 32) | ((ZPOS64_T)c[5] << 40) | ((ZPOS64_T)c[6] << 48) | ((ZPOS64_T)c[7] << 56); + return UNZ_OK; + } else + { *pX = 0; - return err; + if (ZERROR64(*pzlib_filefunc_def,filestream)) + return UNZ_ERRNO; + else + return UNZ_EOF; + } } /* My own strcmpi / strcasecmp */ -local int strcmpcasenosensitive_internal (const char* fileName1, const char* fileName2) -{ +local int strcmpcasenosensitive_internal(const char* fileName1, const char* fileName2) { for (;;) { char c1=*(fileName1++); @@ -379,19 +292,17 @@ local int strcmpcasenosensitive_internal (const char* fileName1, const char* fil #endif /* - Compare two filename (fileName1,fileName2). - If iCaseSenisivity = 1, comparision is case sensitivity (like strcmp) - If iCaseSenisivity = 2, comparision is not case sensitivity (like strcmpi + Compare two filenames (fileName1,fileName2). + If iCaseSensitivity = 1, comparison is case sensitive (like strcmp) + If iCaseSensitivity = 2, comparison is not case sensitive (like strcmpi or strcasecmp) - If iCaseSenisivity = 0, case sensitivity is defaut of your operating system + If iCaseSensitivity = 0, case sensitivity is default of your operating system (like 1 on Unix, 2 on Windows) */ extern int ZEXPORT unzStringFileNameCompare (const char* fileName1, - const char* fileName2, - int iCaseSensitivity) - -{ + const char* fileName2, + int iCaseSensitivity) { if (iCaseSensitivity==0) iCaseSensitivity=CASESENSITIVITYDEFAULTVALUE; @@ -405,21 +316,23 @@ extern int ZEXPORT unzStringFileNameCompare (const char* fileName1, #define BUFREADCOMMENT (0x400) #endif +#ifndef CENTRALDIRINVALID +#define CENTRALDIRINVALID ((ZPOS64_T)(-1)) +#endif + /* Locate the Central directory of a zipfile (at the end, just before the global comment) */ -local ZPOS64_T unz64local_SearchCentralDir OF((const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream)); -local ZPOS64_T unz64local_SearchCentralDir(const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream) -{ +local ZPOS64_T unz64local_SearchCentralDir(const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream) { unsigned char* buf; ZPOS64_T uSizeFile; ZPOS64_T uBackRead; ZPOS64_T uMaxBack=0xffff; /* maximum size of global comment */ - ZPOS64_T uPosFound=0; + ZPOS64_T uPosFound=CENTRALDIRINVALID; if (ZSEEK64(*pzlib_filefunc_def,filestream,0,ZLIB_FILEFUNC_SEEK_END) != 0) - return 0; + return CENTRALDIRINVALID; uSizeFile = ZTELL64(*pzlib_filefunc_def,filestream); @@ -429,7 +342,7 @@ local ZPOS64_T unz64local_SearchCentralDir(const zlib_filefunc64_32_def* pzlib_f buf = (unsigned char*)ALLOC(BUFREADCOMMENT+4); if (buf==NULL) - return 0; + return CENTRALDIRINVALID; uBackRead = 4; while (uBackReadz_filefunc, s->filestream); - TRYFREE(s); + free(s); return UNZ_OK; } @@ -825,8 +727,7 @@ extern int ZEXPORT unzClose (unzFile file) Write info about the ZipFile in the *pglobal_info structure. No preparation of the structure is needed return UNZ_OK if there is no problem. */ -extern int ZEXPORT unzGetGlobalInfo64 (unzFile file, unz_global_info64* pglobal_info) -{ +extern int ZEXPORT unzGetGlobalInfo64(unzFile file, unz_global_info64* pglobal_info) { unz64_s* s; if (file==NULL) return UNZ_PARAMERROR; @@ -835,8 +736,7 @@ extern int ZEXPORT unzGetGlobalInfo64 (unzFile file, unz_global_info64* pglobal_ return UNZ_OK; } -extern int ZEXPORT unzGetGlobalInfo (unzFile file, unz_global_info* pglobal_info32) -{ +extern int ZEXPORT unzGetGlobalInfo(unzFile file, unz_global_info* pglobal_info32) { unz64_s* s; if (file==NULL) return UNZ_PARAMERROR; @@ -847,46 +747,33 @@ extern int ZEXPORT unzGetGlobalInfo (unzFile file, unz_global_info* pglobal_info return UNZ_OK; } /* - Translate date/time from Dos format to tm_unz (readable more easilty) + Translate date/time from Dos format to tm_unz (readable more easily) */ -local void unz64local_DosDateToTmuDate (ZPOS64_T ulDosDate, tm_unz* ptm) -{ +local void unz64local_DosDateToTmuDate(ZPOS64_T ulDosDate, tm_unz* ptm) { ZPOS64_T uDate; uDate = (ZPOS64_T)(ulDosDate>>16); - ptm->tm_mday = (uInt)(uDate&0x1f) ; - ptm->tm_mon = (uInt)((((uDate)&0x1E0)/0x20)-1) ; - ptm->tm_year = (uInt)(((uDate&0x0FE00)/0x0200)+1980) ; + ptm->tm_mday = (int)(uDate&0x1f) ; + ptm->tm_mon = (int)((((uDate)&0x1E0)/0x20)-1) ; + ptm->tm_year = (int)(((uDate&0x0FE00)/0x0200)+1980) ; - ptm->tm_hour = (uInt) ((ulDosDate &0xF800)/0x800); - ptm->tm_min = (uInt) ((ulDosDate&0x7E0)/0x20) ; - ptm->tm_sec = (uInt) (2*(ulDosDate&0x1f)) ; + ptm->tm_hour = (int) ((ulDosDate &0xF800)/0x800); + ptm->tm_min = (int) ((ulDosDate&0x7E0)/0x20) ; + ptm->tm_sec = (int) (2*(ulDosDate&0x1f)) ; } /* Get Info about the current file in the zipfile, with internal only info */ -local int unz64local_GetCurrentFileInfoInternal OF((unzFile file, - unz_file_info64 *pfile_info, - unz_file_info64_internal - *pfile_info_internal, - char *szFileName, - uLong fileNameBufferSize, - void *extraField, - uLong extraFieldBufferSize, - char *szComment, - uLong commentBufferSize)); - -local int unz64local_GetCurrentFileInfoInternal (unzFile file, - unz_file_info64 *pfile_info, - unz_file_info64_internal - *pfile_info_internal, - char *szFileName, - uLong fileNameBufferSize, - void *extraField, - uLong extraFieldBufferSize, - char *szComment, - uLong commentBufferSize) -{ +local int unz64local_GetCurrentFileInfoInternal(unzFile file, + unz_file_info64 *pfile_info, + unz_file_info64_internal + *pfile_info_internal, + char *szFileName, + uLong fileNameBufferSize, + void *extraField, + uLong extraFieldBufferSize, + char *szComment, + uLong commentBufferSize) { unz64_s* s; unz_file_info64 file_info; unz_file_info64_internal file_info_internal; @@ -993,7 +880,7 @@ local int unz64local_GetCurrentFileInfoInternal (unzFile file, if (lSeek!=0) { - if (ZSEEK64(s->z_filefunc, s->filestream,lSeek,ZLIB_FILEFUNC_SEEK_CUR)==0) + if (ZSEEK64(s->z_filefunc, s->filestream,(ZPOS64_T)lSeek,ZLIB_FILEFUNC_SEEK_CUR)==0) lSeek=0; else err=UNZ_ERRNO; @@ -1018,7 +905,7 @@ local int unz64local_GetCurrentFileInfoInternal (unzFile file, if (lSeek!=0) { - if (ZSEEK64(s->z_filefunc, s->filestream,lSeek,ZLIB_FILEFUNC_SEEK_CUR)==0) + if (ZSEEK64(s->z_filefunc, s->filestream,(ZPOS64_T)lSeek,ZLIB_FILEFUNC_SEEK_CUR)==0) lSeek=0; else err=UNZ_ERRNO; @@ -1038,33 +925,31 @@ local int unz64local_GetCurrentFileInfoInternal (unzFile file, /* ZIP64 extra fields */ if (headerId == 0x0001) { - uLong uL; - - if(file_info.uncompressed_size == MAXU32) - { - if (unz64local_getLong64(&s->z_filefunc, s->filestream,&file_info.uncompressed_size) != UNZ_OK) - err=UNZ_ERRNO; - } - - if(file_info.compressed_size == MAXU32) - { - if (unz64local_getLong64(&s->z_filefunc, s->filestream,&file_info.compressed_size) != UNZ_OK) - err=UNZ_ERRNO; - } - - if(file_info_internal.offset_curfile == MAXU32) - { - /* Relative Header offset */ - if (unz64local_getLong64(&s->z_filefunc, s->filestream,&file_info_internal.offset_curfile) != UNZ_OK) - err=UNZ_ERRNO; - } - - if(file_info.disk_num_start == MAXU32) - { - /* Disk Start Number */ - if (unz64local_getLong(&s->z_filefunc, s->filestream,&uL) != UNZ_OK) - err=UNZ_ERRNO; - } + if(file_info.uncompressed_size == MAXU32) + { + if (unz64local_getLong64(&s->z_filefunc, s->filestream,&file_info.uncompressed_size) != UNZ_OK) + err=UNZ_ERRNO; + } + + if(file_info.compressed_size == MAXU32) + { + if (unz64local_getLong64(&s->z_filefunc, s->filestream,&file_info.compressed_size) != UNZ_OK) + err=UNZ_ERRNO; + } + + if(file_info_internal.offset_curfile == MAXU32) + { + /* Relative Header offset */ + if (unz64local_getLong64(&s->z_filefunc, s->filestream,&file_info_internal.offset_curfile) != UNZ_OK) + err=UNZ_ERRNO; + } + + if(file_info.disk_num_start == 0xffff) + { + /* Disk Start Number */ + if (unz64local_getLong(&s->z_filefunc, s->filestream,&file_info.disk_num_start) != UNZ_OK) + err=UNZ_ERRNO; + } } else @@ -1090,7 +975,7 @@ local int unz64local_GetCurrentFileInfoInternal (unzFile file, if (lSeek!=0) { - if (ZSEEK64(s->z_filefunc, s->filestream,lSeek,ZLIB_FILEFUNC_SEEK_CUR)==0) + if (ZSEEK64(s->z_filefunc, s->filestream,(ZPOS64_T)lSeek,ZLIB_FILEFUNC_SEEK_CUR)==0) lSeek=0; else err=UNZ_ERRNO; @@ -1121,24 +1006,22 @@ local int unz64local_GetCurrentFileInfoInternal (unzFile file, No preparation of the structure is needed return UNZ_OK if there is no problem. */ -extern int ZEXPORT unzGetCurrentFileInfo64 (unzFile file, - unz_file_info64 * pfile_info, - char * szFileName, uLong fileNameBufferSize, - void *extraField, uLong extraFieldBufferSize, - char* szComment, uLong commentBufferSize) -{ +extern int ZEXPORT unzGetCurrentFileInfo64(unzFile file, + unz_file_info64 * pfile_info, + char * szFileName, uLong fileNameBufferSize, + void *extraField, uLong extraFieldBufferSize, + char* szComment, uLong commentBufferSize) { return unz64local_GetCurrentFileInfoInternal(file,pfile_info,NULL, - szFileName,fileNameBufferSize, - extraField,extraFieldBufferSize, - szComment,commentBufferSize); + szFileName,fileNameBufferSize, + extraField,extraFieldBufferSize, + szComment,commentBufferSize); } -extern int ZEXPORT unzGetCurrentFileInfo (unzFile file, - unz_file_info * pfile_info, - char * szFileName, uLong fileNameBufferSize, - void *extraField, uLong extraFieldBufferSize, - char* szComment, uLong commentBufferSize) -{ +extern int ZEXPORT unzGetCurrentFileInfo(unzFile file, + unz_file_info * pfile_info, + char * szFileName, uLong fileNameBufferSize, + void *extraField, uLong extraFieldBufferSize, + char* szComment, uLong commentBufferSize) { int err; unz_file_info64 file_info64; err = unz64local_GetCurrentFileInfoInternal(file,&file_info64,NULL, @@ -1162,7 +1045,7 @@ extern int ZEXPORT unzGetCurrentFileInfo (unzFile file, pfile_info->internal_fa = file_info64.internal_fa; pfile_info->external_fa = file_info64.external_fa; - pfile_info->tmu_date = file_info64.tmu_date, + pfile_info->tmu_date = file_info64.tmu_date; pfile_info->compressed_size = (uLong)file_info64.compressed_size; @@ -1175,8 +1058,7 @@ extern int ZEXPORT unzGetCurrentFileInfo (unzFile file, Set the current file of the zipfile to the first file. return UNZ_OK if there is no problem */ -extern int ZEXPORT unzGoToFirstFile (unzFile file) -{ +extern int ZEXPORT unzGoToFirstFile(unzFile file) { int err=UNZ_OK; unz64_s* s; if (file==NULL) @@ -1196,8 +1078,7 @@ extern int ZEXPORT unzGoToFirstFile (unzFile file) return UNZ_OK if there is no problem return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest. */ -extern int ZEXPORT unzGoToNextFile (unzFile file) -{ +extern int ZEXPORT unzGoToNextFile(unzFile file) { unz64_s* s; int err; @@ -1229,8 +1110,7 @@ extern int ZEXPORT unzGoToNextFile (unzFile file) UNZ_OK if the file is found. It becomes the current file. UNZ_END_OF_LIST_OF_FILE if the file is not found */ -extern int ZEXPORT unzLocateFile (unzFile file, const char *szFileName, int iCaseSensitivity) -{ +extern int ZEXPORT unzLocateFile(unzFile file, const char *szFileName, int iCaseSensitivity) { unz64_s* s; int err; @@ -1305,8 +1185,7 @@ typedef struct unz_file_pos_s } unz_file_pos; */ -extern int ZEXPORT unzGetFilePos64(unzFile file, unz64_file_pos* file_pos) -{ +extern int ZEXPORT unzGetFilePos64(unzFile file, unz64_file_pos* file_pos) { unz64_s* s; if (file==NULL || file_pos==NULL) @@ -1321,10 +1200,7 @@ extern int ZEXPORT unzGetFilePos64(unzFile file, unz64_file_pos* file_pos) return UNZ_OK; } -extern int ZEXPORT unzGetFilePos( - unzFile file, - unz_file_pos* file_pos) -{ +extern int ZEXPORT unzGetFilePos(unzFile file, unz_file_pos* file_pos) { unz64_file_pos file_pos64; int err = unzGetFilePos64(file,&file_pos64); if (err==UNZ_OK) @@ -1335,8 +1211,7 @@ extern int ZEXPORT unzGetFilePos( return err; } -extern int ZEXPORT unzGoToFilePos64(unzFile file, const unz64_file_pos* file_pos) -{ +extern int ZEXPORT unzGoToFilePos64(unzFile file, const unz64_file_pos* file_pos) { unz64_s* s; int err; @@ -1357,10 +1232,7 @@ extern int ZEXPORT unzGoToFilePos64(unzFile file, const unz64_file_pos* file_pos return err; } -extern int ZEXPORT unzGoToFilePos( - unzFile file, - unz_file_pos* file_pos) -{ +extern int ZEXPORT unzGoToFilePos(unzFile file, unz_file_pos* file_pos) { unz64_file_pos file_pos64; if (file_pos == NULL) return UNZ_PARAMERROR; @@ -1382,10 +1254,9 @@ extern int ZEXPORT unzGoToFilePos( store in *piSizeVar the size of extra info in local header (filename and size of extra field data) */ -local int unz64local_CheckCurrentFileCoherencyHeader (unz64_s* s, uInt* piSizeVar, - ZPOS64_T * poffset_local_extrafield, - uInt * psize_local_extrafield) -{ +local int unz64local_CheckCurrentFileCoherencyHeader(unz64_s* s, uInt* piSizeVar, + ZPOS64_T * poffset_local_extrafield, + uInt * psize_local_extrafield) { uLong uMagic,uData,uFlags; uLong size_filename; uLong size_extra_field; @@ -1469,9 +1340,8 @@ local int unz64local_CheckCurrentFileCoherencyHeader (unz64_s* s, uInt* piSizeVa Open for reading data the current file in the zipfile. If there is no error and the file is opened, the return value is UNZ_OK. */ -extern int ZEXPORT unzOpenCurrentFile3 (unzFile file, int* method, - int* level, int raw, const char* password) -{ +extern int ZEXPORT unzOpenCurrentFile3(unzFile file, int* method, + int* level, int raw, const char* password) { int err=UNZ_OK; uInt iSizeVar; unz64_s* s; @@ -1509,7 +1379,7 @@ extern int ZEXPORT unzOpenCurrentFile3 (unzFile file, int* method, if (pfile_in_zip_read_info->read_buffer==NULL) { - TRYFREE(pfile_in_zip_read_info); + free(pfile_in_zip_read_info); return UNZ_INTERNALERROR; } @@ -1566,7 +1436,8 @@ extern int ZEXPORT unzOpenCurrentFile3 (unzFile file, int* method, pfile_in_zip_read_info->stream_initialised=Z_BZIP2ED; else { - TRYFREE(pfile_in_zip_read_info); + free(pfile_in_zip_read_info->read_buffer); + free(pfile_in_zip_read_info); return err; } #else @@ -1586,7 +1457,8 @@ extern int ZEXPORT unzOpenCurrentFile3 (unzFile file, int* method, pfile_in_zip_read_info->stream_initialised=Z_DEFLATED; else { - TRYFREE(pfile_in_zip_read_info); + free(pfile_in_zip_read_info->read_buffer); + free(pfile_in_zip_read_info); return err; } /* windowBits is passed < 0 to tell that there is no zlib header. @@ -1638,25 +1510,21 @@ extern int ZEXPORT unzOpenCurrentFile3 (unzFile file, int* method, return UNZ_OK; } -extern int ZEXPORT unzOpenCurrentFile (unzFile file) -{ +extern int ZEXPORT unzOpenCurrentFile(unzFile file) { return unzOpenCurrentFile3(file, NULL, NULL, 0, NULL); } -extern int ZEXPORT unzOpenCurrentFilePassword (unzFile file, const char* password) -{ +extern int ZEXPORT unzOpenCurrentFilePassword(unzFile file, const char* password) { return unzOpenCurrentFile3(file, NULL, NULL, 0, password); } -extern int ZEXPORT unzOpenCurrentFile2 (unzFile file, int* method, int* level, int raw) -{ +extern int ZEXPORT unzOpenCurrentFile2(unzFile file, int* method, int* level, int raw) { return unzOpenCurrentFile3(file, method, level, raw, NULL); } /** Addition for GDAL : START */ -extern ZPOS64_T ZEXPORT unzGetCurrentFileZStreamPos64( unzFile file) -{ +extern ZPOS64_T ZEXPORT unzGetCurrentFileZStreamPos64(unzFile file) { unz64_s* s; file_in_zip64_read_info_s* pfile_in_zip_read_info; s=(unz64_s*)file; @@ -1676,13 +1544,12 @@ extern ZPOS64_T ZEXPORT unzGetCurrentFileZStreamPos64( unzFile file) buf contain buffer where data must be copied len the size of buf. - return the number of byte copied if somes bytes are copied + return the number of byte copied if some bytes are copied return 0 if the end of file was reached return <0 with error code if there is an error (UNZ_ERRNO for IO error, or zLib error for uncompress error) */ -extern int ZEXPORT unzReadCurrentFile (unzFile file, voidp buf, unsigned len) -{ +extern int ZEXPORT unzReadCurrentFile(unzFile file, voidp buf, unsigned len) { int err=UNZ_OK; uInt iRead = 0; unz64_s* s; @@ -1767,7 +1634,7 @@ extern int ZEXPORT unzReadCurrentFile (unzFile file, voidp buf, unsigned len) if ((pfile_in_zip_read_info->stream.avail_in == 0) && (pfile_in_zip_read_info->rest_read_compressed == 0)) - return (iRead==0) ? UNZ_EOF : iRead; + return (iRead==0) ? UNZ_EOF : (int)iRead; if (pfile_in_zip_read_info->stream.avail_out < pfile_in_zip_read_info->stream.avail_in) @@ -1857,6 +1724,9 @@ extern int ZEXPORT unzReadCurrentFile (unzFile file, voidp buf, unsigned len) err = Z_DATA_ERROR; uTotalOutAfter = pfile_in_zip_read_info->stream.total_out; + /* Detect overflow, because z_stream.total_out is uLong (32 bits) */ + if (uTotalOutAftertotal_out_64 = pfile_in_zip_read_info->total_out_64 + uOutThis; @@ -1871,14 +1741,14 @@ extern int ZEXPORT unzReadCurrentFile (unzFile file, voidp buf, unsigned len) iRead += (uInt)(uTotalOutAfter - uTotalOutBefore); if (err==Z_STREAM_END) - return (iRead==0) ? UNZ_EOF : iRead; + return (iRead==0) ? UNZ_EOF : (int)iRead; if (err!=Z_OK) break; } } if (err==Z_OK) - return iRead; + return (int)iRead; return err; } @@ -1886,8 +1756,7 @@ extern int ZEXPORT unzReadCurrentFile (unzFile file, voidp buf, unsigned len) /* Give the current position in uncompressed data */ -extern z_off_t ZEXPORT unztell (unzFile file) -{ +extern z_off_t ZEXPORT unztell(unzFile file) { unz64_s* s; file_in_zip64_read_info_s* pfile_in_zip_read_info; if (file==NULL) @@ -1901,8 +1770,7 @@ extern z_off_t ZEXPORT unztell (unzFile file) return (z_off_t)pfile_in_zip_read_info->stream.total_out; } -extern ZPOS64_T ZEXPORT unztell64 (unzFile file) -{ +extern ZPOS64_T ZEXPORT unztell64(unzFile file) { unz64_s* s; file_in_zip64_read_info_s* pfile_in_zip_read_info; @@ -1921,8 +1789,7 @@ extern ZPOS64_T ZEXPORT unztell64 (unzFile file) /* return 1 if the end of file was reached, 0 elsewhere */ -extern int ZEXPORT unzeof (unzFile file) -{ +extern int ZEXPORT unzeof(unzFile file) { unz64_s* s; file_in_zip64_read_info_s* pfile_in_zip_read_info; if (file==NULL) @@ -1953,8 +1820,7 @@ more info in the local-header version than in the central-header) the return value is the number of bytes copied in buf, or (if <0) the error code */ -extern int ZEXPORT unzGetLocalExtrafield (unzFile file, voidp buf, unsigned len) -{ +extern int ZEXPORT unzGetLocalExtrafield(unzFile file, voidp buf, unsigned len) { unz64_s* s; file_in_zip64_read_info_s* pfile_in_zip_read_info; uInt read_now; @@ -2001,8 +1867,7 @@ extern int ZEXPORT unzGetLocalExtrafield (unzFile file, voidp buf, unsigned len) Close the file in zip opened with unzOpenCurrentFile Return UNZ_CRCERROR if all the file was read but the CRC is not good */ -extern int ZEXPORT unzCloseCurrentFile (unzFile file) -{ +extern int ZEXPORT unzCloseCurrentFile(unzFile file) { int err=UNZ_OK; unz64_s* s; @@ -2024,7 +1889,7 @@ extern int ZEXPORT unzCloseCurrentFile (unzFile file) } - TRYFREE(pfile_in_zip_read_info->read_buffer); + free(pfile_in_zip_read_info->read_buffer); pfile_in_zip_read_info->read_buffer = NULL; if (pfile_in_zip_read_info->stream_initialised == Z_DEFLATED) inflateEnd(&pfile_in_zip_read_info->stream); @@ -2035,7 +1900,7 @@ extern int ZEXPORT unzCloseCurrentFile (unzFile file) pfile_in_zip_read_info->stream_initialised = 0; - TRYFREE(pfile_in_zip_read_info); + free(pfile_in_zip_read_info); s->pfile_in_zip_read=NULL; @@ -2048,8 +1913,7 @@ extern int ZEXPORT unzCloseCurrentFile (unzFile file) uSizeBuf is the size of the szComment buffer. return the number of byte copied or an error code <0 */ -extern int ZEXPORT unzGetGlobalComment (unzFile file, char * szComment, uLong uSizeBuf) -{ +extern int ZEXPORT unzGetGlobalComment(unzFile file, char * szComment, uLong uSizeBuf) { unz64_s* s; uLong uReadThis ; if (file==NULL) @@ -2076,8 +1940,7 @@ extern int ZEXPORT unzGetGlobalComment (unzFile file, char * szComment, uLong uS } /* Additions by RX '2004 */ -extern ZPOS64_T ZEXPORT unzGetOffset64(unzFile file) -{ +extern ZPOS64_T ZEXPORT unzGetOffset64(unzFile file) { unz64_s* s; if (file==NULL) @@ -2091,8 +1954,7 @@ extern ZPOS64_T ZEXPORT unzGetOffset64(unzFile file) return s->pos_in_central_dir; } -extern uLong ZEXPORT unzGetOffset (unzFile file) -{ +extern uLong ZEXPORT unzGetOffset(unzFile file) { ZPOS64_T offset64; if (file==NULL) @@ -2101,8 +1963,7 @@ extern uLong ZEXPORT unzGetOffset (unzFile file) return (uLong)offset64; } -extern int ZEXPORT unzSetOffset64(unzFile file, ZPOS64_T pos) -{ +extern int ZEXPORT unzSetOffset64(unzFile file, ZPOS64_T pos) { unz64_s* s; int err; @@ -2119,7 +1980,6 @@ extern int ZEXPORT unzSetOffset64(unzFile file, ZPOS64_T pos) return err; } -extern int ZEXPORT unzSetOffset (unzFile file, uLong pos) -{ +extern int ZEXPORT unzSetOffset (unzFile file, uLong pos) { return unzSetOffset64(file,pos); } diff --git a/zlib/contrib/minizip/unzip.h b/zlib/contrib/minizip/unzip.h index 2104e3915074..5cfc9c6274e7 100644 --- a/zlib/contrib/minizip/unzip.h +++ b/zlib/contrib/minizip/unzip.h @@ -83,12 +83,12 @@ typedef voidp unzFile; /* tm_unz contain date/time info */ typedef struct tm_unz_s { - uInt tm_sec; /* seconds after the minute - [0,59] */ - uInt tm_min; /* minutes after the hour - [0,59] */ - uInt tm_hour; /* hours since midnight - [0,23] */ - uInt tm_mday; /* day of the month - [1,31] */ - uInt tm_mon; /* months since January - [0,11] */ - uInt tm_year; /* years - [1980..2044] */ + int tm_sec; /* seconds after the minute - [0,59] */ + int tm_min; /* minutes after the hour - [0,59] */ + int tm_hour; /* hours since midnight - [0,23] */ + int tm_mday; /* day of the month - [1,31] */ + int tm_mon; /* months since January - [0,11] */ + int tm_year; /* years - [1980..2044] */ } tm_unz; /* unz_global_info structure contain global data about the ZIPfile @@ -150,21 +150,21 @@ typedef struct unz_file_info_s tm_unz tmu_date; } unz_file_info; -extern int ZEXPORT unzStringFileNameCompare OF ((const char* fileName1, - const char* fileName2, - int iCaseSensitivity)); +extern int ZEXPORT unzStringFileNameCompare(const char* fileName1, + const char* fileName2, + int iCaseSensitivity); /* - Compare two filename (fileName1,fileName2). - If iCaseSenisivity = 1, comparision is case sensitivity (like strcmp) - If iCaseSenisivity = 2, comparision is not case sensitivity (like strcmpi + Compare two filenames (fileName1,fileName2). + If iCaseSensitivity = 1, comparison is case sensitive (like strcmp) + If iCaseSensitivity = 2, comparison is not case sensitive (like strcmpi or strcasecmp) - If iCaseSenisivity = 0, case sensitivity is defaut of your operating system + If iCaseSensitivity = 0, case sensitivity is default of your operating system (like 1 on Unix, 2 on Windows) */ -extern unzFile ZEXPORT unzOpen OF((const char *path)); -extern unzFile ZEXPORT unzOpen64 OF((const void *path)); +extern unzFile ZEXPORT unzOpen(const char *path); +extern unzFile ZEXPORT unzOpen64(const void *path); /* Open a Zip file. path contain the full pathname (by example, on a Windows XP computer "c:\\zlib\\zlib113.zip" or on an Unix computer @@ -181,41 +181,41 @@ extern unzFile ZEXPORT unzOpen64 OF((const void *path)); */ -extern unzFile ZEXPORT unzOpen2 OF((const char *path, - zlib_filefunc_def* pzlib_filefunc_def)); +extern unzFile ZEXPORT unzOpen2(const char *path, + zlib_filefunc_def* pzlib_filefunc_def); /* Open a Zip file, like unzOpen, but provide a set of file low level API for read/write the zip file (see ioapi.h) */ -extern unzFile ZEXPORT unzOpen2_64 OF((const void *path, - zlib_filefunc64_def* pzlib_filefunc_def)); +extern unzFile ZEXPORT unzOpen2_64(const void *path, + zlib_filefunc64_def* pzlib_filefunc_def); /* Open a Zip file, like unz64Open, but provide a set of file low level API for read/write the zip file (see ioapi.h) */ -extern int ZEXPORT unzClose OF((unzFile file)); +extern int ZEXPORT unzClose(unzFile file); /* Close a ZipFile opened with unzOpen. If there is files inside the .Zip opened with unzOpenCurrentFile (see later), these files MUST be closed with unzCloseCurrentFile before call unzClose. return UNZ_OK if there is no problem. */ -extern int ZEXPORT unzGetGlobalInfo OF((unzFile file, - unz_global_info *pglobal_info)); +extern int ZEXPORT unzGetGlobalInfo(unzFile file, + unz_global_info *pglobal_info); -extern int ZEXPORT unzGetGlobalInfo64 OF((unzFile file, - unz_global_info64 *pglobal_info)); +extern int ZEXPORT unzGetGlobalInfo64(unzFile file, + unz_global_info64 *pglobal_info); /* Write info about the ZipFile in the *pglobal_info structure. No preparation of the structure is needed return UNZ_OK if there is no problem. */ -extern int ZEXPORT unzGetGlobalComment OF((unzFile file, - char *szComment, - uLong uSizeBuf)); +extern int ZEXPORT unzGetGlobalComment(unzFile file, + char *szComment, + uLong uSizeBuf); /* Get the global comment string of the ZipFile, in the szComment buffer. uSizeBuf is the size of the szComment buffer. @@ -226,22 +226,22 @@ extern int ZEXPORT unzGetGlobalComment OF((unzFile file, /***************************************************************************/ /* Unzip package allow you browse the directory of the zipfile */ -extern int ZEXPORT unzGoToFirstFile OF((unzFile file)); +extern int ZEXPORT unzGoToFirstFile(unzFile file); /* Set the current file of the zipfile to the first file. return UNZ_OK if there is no problem */ -extern int ZEXPORT unzGoToNextFile OF((unzFile file)); +extern int ZEXPORT unzGoToNextFile(unzFile file); /* Set the current file of the zipfile to the next file. return UNZ_OK if there is no problem return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest. */ -extern int ZEXPORT unzLocateFile OF((unzFile file, - const char *szFileName, - int iCaseSensitivity)); +extern int ZEXPORT unzLocateFile(unzFile file, + const char *szFileName, + int iCaseSensitivity); /* Try locate the file szFileName in the zipfile. For the iCaseSensitivity signification, see unzStringFileNameCompare @@ -285,28 +285,28 @@ extern int ZEXPORT unzGoToFilePos64( /* ****************************************** */ -extern int ZEXPORT unzGetCurrentFileInfo64 OF((unzFile file, - unz_file_info64 *pfile_info, - char *szFileName, - uLong fileNameBufferSize, - void *extraField, - uLong extraFieldBufferSize, - char *szComment, - uLong commentBufferSize)); - -extern int ZEXPORT unzGetCurrentFileInfo OF((unzFile file, - unz_file_info *pfile_info, - char *szFileName, - uLong fileNameBufferSize, - void *extraField, - uLong extraFieldBufferSize, - char *szComment, - uLong commentBufferSize)); +extern int ZEXPORT unzGetCurrentFileInfo64(unzFile file, + unz_file_info64 *pfile_info, + char *szFileName, + uLong fileNameBufferSize, + void *extraField, + uLong extraFieldBufferSize, + char *szComment, + uLong commentBufferSize); + +extern int ZEXPORT unzGetCurrentFileInfo(unzFile file, + unz_file_info *pfile_info, + char *szFileName, + uLong fileNameBufferSize, + void *extraField, + uLong extraFieldBufferSize, + char *szComment, + uLong commentBufferSize); /* Get Info about the current file - if pfile_info!=NULL, the *pfile_info structure will contain somes info about + if pfile_info!=NULL, the *pfile_info structure will contain some info about the current file - if szFileName!=NULL, the filemane string will be copied in szFileName + if szFileName!=NULL, the filename string will be copied in szFileName (fileNameBufferSize is the size of the buffer) if extraField!=NULL, the extra field information will be copied in extraField (extraFieldBufferSize is the size of the buffer). @@ -318,7 +318,7 @@ extern int ZEXPORT unzGetCurrentFileInfo OF((unzFile file, /** Addition for GDAL : START */ -extern ZPOS64_T ZEXPORT unzGetCurrentFileZStreamPos64 OF((unzFile file)); +extern ZPOS64_T ZEXPORT unzGetCurrentFileZStreamPos64(unzFile file); /** Addition for GDAL : END */ @@ -328,24 +328,24 @@ extern ZPOS64_T ZEXPORT unzGetCurrentFileZStreamPos64 OF((unzFile file)); from it, and close it (you can close it before reading all the file) */ -extern int ZEXPORT unzOpenCurrentFile OF((unzFile file)); +extern int ZEXPORT unzOpenCurrentFile(unzFile file); /* Open for reading data the current file in the zipfile. If there is no error, the return value is UNZ_OK. */ -extern int ZEXPORT unzOpenCurrentFilePassword OF((unzFile file, - const char* password)); +extern int ZEXPORT unzOpenCurrentFilePassword(unzFile file, + const char* password); /* Open for reading data the current file in the zipfile. password is a crypting password If there is no error, the return value is UNZ_OK. */ -extern int ZEXPORT unzOpenCurrentFile2 OF((unzFile file, - int* method, - int* level, - int raw)); +extern int ZEXPORT unzOpenCurrentFile2(unzFile file, + int* method, + int* level, + int raw); /* Same than unzOpenCurrentFile, but open for read raw the file (not uncompress) if raw==1 @@ -355,11 +355,11 @@ extern int ZEXPORT unzOpenCurrentFile2 OF((unzFile file, but you CANNOT set method parameter as NULL */ -extern int ZEXPORT unzOpenCurrentFile3 OF((unzFile file, - int* method, - int* level, - int raw, - const char* password)); +extern int ZEXPORT unzOpenCurrentFile3(unzFile file, + int* method, + int* level, + int raw, + const char* password); /* Same than unzOpenCurrentFile, but open for read raw the file (not uncompress) if raw==1 @@ -370,41 +370,41 @@ extern int ZEXPORT unzOpenCurrentFile3 OF((unzFile file, */ -extern int ZEXPORT unzCloseCurrentFile OF((unzFile file)); +extern int ZEXPORT unzCloseCurrentFile(unzFile file); /* Close the file in zip opened with unzOpenCurrentFile Return UNZ_CRCERROR if all the file was read but the CRC is not good */ -extern int ZEXPORT unzReadCurrentFile OF((unzFile file, - voidp buf, - unsigned len)); +extern int ZEXPORT unzReadCurrentFile(unzFile file, + voidp buf, + unsigned len); /* Read bytes from the current file (opened by unzOpenCurrentFile) buf contain buffer where data must be copied len the size of buf. - return the number of byte copied if somes bytes are copied + return the number of byte copied if some bytes are copied return 0 if the end of file was reached return <0 with error code if there is an error (UNZ_ERRNO for IO error, or zLib error for uncompress error) */ -extern z_off_t ZEXPORT unztell OF((unzFile file)); +extern z_off_t ZEXPORT unztell(unzFile file); -extern ZPOS64_T ZEXPORT unztell64 OF((unzFile file)); +extern ZPOS64_T ZEXPORT unztell64(unzFile file); /* Give the current position in uncompressed data */ -extern int ZEXPORT unzeof OF((unzFile file)); +extern int ZEXPORT unzeof(unzFile file); /* return 1 if the end of file was reached, 0 elsewhere */ -extern int ZEXPORT unzGetLocalExtrafield OF((unzFile file, - voidp buf, - unsigned len)); +extern int ZEXPORT unzGetLocalExtrafield(unzFile file, + voidp buf, + unsigned len); /* Read extra field from the current file (opened by unzOpenCurrentFile) This is the local-header version of the extra field (sometimes, there is diff --git a/zlib/contrib/minizip/zip.c b/zlib/contrib/minizip/zip.c index 44e88a9cb989..60bdffac3485 100644 --- a/zlib/contrib/minizip/zip.c +++ b/zlib/contrib/minizip/zip.c @@ -14,7 +14,7 @@ Oct-2009 - Mathias Svensson - Added Zip64 Support when creating new file archives Oct-2009 - Mathias Svensson - Did some code cleanup and refactoring to get better overview of some functions. Oct-2009 - Mathias Svensson - Added zipRemoveExtraInfoBlock to strip extra field data from its ZIP64 data - It is used when recreting zip archive with RAW when deleting items from a zip. + It is used when recreating zip archive with RAW when deleting items from a zip. ZIP64 data is automatically added to items that needs it, and existing ZIP64 data need to be removed. Oct-2009 - Mathias Svensson - Added support for BZIP2 as compression mode (bzip2 lib is required) Jan-2010 - back to unzip and minizip 1.0 name scheme, with compatibility layer @@ -25,14 +25,13 @@ #include #include #include +#include #include #include "zlib.h" #include "zip.h" #ifdef STDC # include -# include -# include #endif #ifdef NO_ERRNO_H extern int errno; @@ -47,7 +46,7 @@ /* compile with -Dlocal if your debugger can't find static symbols */ #ifndef VERSIONMADEBY -# define VERSIONMADEBY (0x0) /* platform depedent */ +# define VERSIONMADEBY (0x0) /* platform dependent */ #endif #ifndef Z_BUFSIZE @@ -61,9 +60,6 @@ #ifndef ALLOC # define ALLOC(size) (malloc(size)) #endif -#ifndef TRYFREE -# define TRYFREE(p) {if (p) free(p);} -#endif /* #define SIZECENTRALDIRITEM (0x2e) @@ -138,37 +134,37 @@ typedef struct uInt pos_in_buffered_data; /* last written byte in buffered_data */ ZPOS64_T pos_local_header; /* offset of the local header of the file - currenty writing */ + currently writing */ char* central_header; /* central header data for the current file */ uLong size_centralExtra; uLong size_centralheader; /* size of the central header for cur file */ uLong size_centralExtraFree; /* Extra bytes allocated to the centralheader but that are not used */ uLong flag; /* flag of the file currently writing */ - int method; /* compression method of file currenty wr.*/ + int method; /* compression method of file currently wr.*/ int raw; /* 1 for directly writing raw data */ Byte buffered_data[Z_BUFSIZE];/* buffer contain compressed data to be writ*/ uLong dosDate; uLong crc32; int encrypt; - int zip64; /* Add ZIP64 extened information in the extra field */ + int zip64; /* Add ZIP64 extended information in the extra field */ ZPOS64_T pos_zip64extrainfo; ZPOS64_T totalCompressedData; ZPOS64_T totalUncompressedData; #ifndef NOCRYPT unsigned long keys[3]; /* keys defining the pseudo-random sequence */ const z_crc_t* pcrc_32_tab; - int crypt_header_size; + unsigned crypt_header_size; #endif } curfile64_info; typedef struct { zlib_filefunc64_32_def z_filefunc; - voidpf filestream; /* io structore of the zipfile */ + voidpf filestream; /* io structure of the zipfile */ linkedlist_data central_dir;/* datablock with central dir in construction*/ int in_opened_file_inzip; /* 1 if a file in the zip is currently writ.*/ - curfile64_info ci; /* info on the file curretly writing */ + curfile64_info ci; /* info on the file currently writing */ ZPOS64_T begin_pos; /* position of the beginning of the zipfile */ ZPOS64_T add_position_when_writing_offset; @@ -186,8 +182,7 @@ typedef struct #include "crypt.h" #endif -local linkedlist_datablock_internal* allocate_new_datablock() -{ +local linkedlist_datablock_internal* allocate_new_datablock(void) { linkedlist_datablock_internal* ldi; ldi = (linkedlist_datablock_internal*) ALLOC(sizeof(linkedlist_datablock_internal)); @@ -200,30 +195,26 @@ local linkedlist_datablock_internal* allocate_new_datablock() return ldi; } -local void free_datablock(linkedlist_datablock_internal* ldi) -{ +local void free_datablock(linkedlist_datablock_internal* ldi) { while (ldi!=NULL) { linkedlist_datablock_internal* ldinext = ldi->next_datablock; - TRYFREE(ldi); + free(ldi); ldi = ldinext; } } -local void init_linkedlist(linkedlist_data* ll) -{ +local void init_linkedlist(linkedlist_data* ll) { ll->first_block = ll->last_block = NULL; } -local void free_linkedlist(linkedlist_data* ll) -{ +local void free_linkedlist(linkedlist_data* ll) { free_datablock(ll->first_block); ll->first_block = ll->last_block = NULL; } -local int add_data_in_datablock(linkedlist_data* ll, const void* buf, uLong len) -{ +local int add_data_in_datablock(linkedlist_data* ll, const void* buf, uLong len) { linkedlist_datablock_internal* ldi; const unsigned char* from_copy; @@ -238,7 +229,7 @@ local int add_data_in_datablock(linkedlist_data* ll, const void* buf, uLong len) } ldi = ll->last_block; - from_copy = (unsigned char*)buf; + from_copy = (const unsigned char*)buf; while (len>0) { @@ -283,9 +274,7 @@ local int add_data_in_datablock(linkedlist_data* ll, const void* buf, uLong len) nbByte == 1, 2 ,4 or 8 (byte, short or long, ZPOS64_T) */ -local int zip64local_putValue OF((const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, ZPOS64_T x, int nbByte)); -local int zip64local_putValue (const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, ZPOS64_T x, int nbByte) -{ +local int zip64local_putValue(const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, ZPOS64_T x, int nbByte) { unsigned char buf[8]; int n; for (n = 0; n < nbByte; n++) @@ -301,15 +290,13 @@ local int zip64local_putValue (const zlib_filefunc64_32_def* pzlib_filefunc_def, } } - if (ZWRITE64(*pzlib_filefunc_def,filestream,buf,nbByte)!=(uLong)nbByte) + if (ZWRITE64(*pzlib_filefunc_def,filestream,buf,(uLong)nbByte)!=(uLong)nbByte) return ZIP_ERRNO; else return ZIP_OK; } -local void zip64local_putValue_inmemory OF((void* dest, ZPOS64_T x, int nbByte)); -local void zip64local_putValue_inmemory (void* dest, ZPOS64_T x, int nbByte) -{ +local void zip64local_putValue_inmemory (void* dest, ZPOS64_T x, int nbByte) { unsigned char* buf=(unsigned char*)dest; int n; for (n = 0; n < nbByte; n++) { @@ -329,25 +316,21 @@ local void zip64local_putValue_inmemory (void* dest, ZPOS64_T x, int nbByte) /****************************************************************************/ -local uLong zip64local_TmzDateToDosDate(const tm_zip* ptm) -{ +local uLong zip64local_TmzDateToDosDate(const tm_zip* ptm) { uLong year = (uLong)ptm->tm_year; if (year>=1980) year-=1980; else if (year>=80) year-=80; return - (uLong) (((ptm->tm_mday) + (32 * (ptm->tm_mon+1)) + (512 * year)) << 16) | - ((ptm->tm_sec/2) + (32* ptm->tm_min) + (2048 * (uLong)ptm->tm_hour)); + (uLong) (((uLong)(ptm->tm_mday) + (32 * (uLong)(ptm->tm_mon+1)) + (512 * year)) << 16) | + (((uLong)ptm->tm_sec/2) + (32 * (uLong)ptm->tm_min) + (2048 * (uLong)ptm->tm_hour)); } /****************************************************************************/ -local int zip64local_getByte OF((const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, int *pi)); - -local int zip64local_getByte(const zlib_filefunc64_32_def* pzlib_filefunc_def,voidpf filestream,int* pi) -{ +local int zip64local_getByte(const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, int* pi) { unsigned char c; int err = (int)ZREAD64(*pzlib_filefunc_def,filestream,&c,1); if (err==1) @@ -368,10 +351,7 @@ local int zip64local_getByte(const zlib_filefunc64_32_def* pzlib_filefunc_def,vo /* =========================================================================== Reads a long in LSB order from the given gz_stream. Sets */ -local int zip64local_getShort OF((const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, uLong *pX)); - -local int zip64local_getShort (const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, uLong* pX) -{ +local int zip64local_getShort(const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, uLong* pX) { uLong x ; int i = 0; int err; @@ -390,10 +370,7 @@ local int zip64local_getShort (const zlib_filefunc64_32_def* pzlib_filefunc_def, return err; } -local int zip64local_getLong OF((const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, uLong *pX)); - -local int zip64local_getLong (const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, uLong* pX) -{ +local int zip64local_getLong(const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, uLong* pX) { uLong x ; int i = 0; int err; @@ -420,11 +397,8 @@ local int zip64local_getLong (const zlib_filefunc64_32_def* pzlib_filefunc_def, return err; } -local int zip64local_getLong64 OF((const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, ZPOS64_T *pX)); - -local int zip64local_getLong64 (const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, ZPOS64_T *pX) -{ +local int zip64local_getLong64(const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, ZPOS64_T *pX) { ZPOS64_T x; int i = 0; int err; @@ -475,10 +449,7 @@ local int zip64local_getLong64 (const zlib_filefunc64_32_def* pzlib_filefunc_def Locate the Central directory of a zipfile (at the end, just before the global comment) */ -local ZPOS64_T zip64local_SearchCentralDir OF((const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream)); - -local ZPOS64_T zip64local_SearchCentralDir(const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream) -{ +local ZPOS64_T zip64local_SearchCentralDir(const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream) { unsigned char* buf; ZPOS64_T uSizeFile; ZPOS64_T uBackRead; @@ -522,14 +493,14 @@ local ZPOS64_T zip64local_SearchCentralDir(const zlib_filefunc64_32_def* pzlib_f if (((*(buf+i))==0x50) && ((*(buf+i+1))==0x4b) && ((*(buf+i+2))==0x05) && ((*(buf+i+3))==0x06)) { - uPosFound = uReadPos+i; + uPosFound = uReadPos+(unsigned)i; break; } - if (uPosFound!=0) - break; + if (uPosFound!=0) + break; } - TRYFREE(buf); + free(buf); return uPosFound; } @@ -537,10 +508,7 @@ local ZPOS64_T zip64local_SearchCentralDir(const zlib_filefunc64_32_def* pzlib_f Locate the End of Zip64 Central directory locator and from there find the CD of a zipfile (at the end, just before the global comment) */ -local ZPOS64_T zip64local_SearchCentralDir64 OF((const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream)); - -local ZPOS64_T zip64local_SearchCentralDir64(const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream) -{ +local ZPOS64_T zip64local_SearchCentralDir64(const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream) { unsigned char* buf; ZPOS64_T uSizeFile; ZPOS64_T uBackRead; @@ -586,7 +554,7 @@ local ZPOS64_T zip64local_SearchCentralDir64(const zlib_filefunc64_32_def* pzlib // Signature "0x07064b50" Zip64 end of central directory locater if (((*(buf+i))==0x50) && ((*(buf+i+1))==0x4b) && ((*(buf+i+2))==0x06) && ((*(buf+i+3))==0x07)) { - uPosFound = uReadPos+i; + uPosFound = uReadPos+(unsigned)i; break; } } @@ -595,7 +563,7 @@ local ZPOS64_T zip64local_SearchCentralDir64(const zlib_filefunc64_32_def* pzlib break; } - TRYFREE(buf); + free(buf); if (uPosFound == 0) return 0; @@ -607,7 +575,7 @@ local ZPOS64_T zip64local_SearchCentralDir64(const zlib_filefunc64_32_def* pzlib if (zip64local_getLong(pzlib_filefunc_def,filestream,&uL)!=ZIP_OK) return 0; - /* number of the disk with the start of the zip64 end of central directory */ + /* number of the disk with the start of the zip64 end of central directory */ if (zip64local_getLong(pzlib_filefunc_def,filestream,&uL)!=ZIP_OK) return 0; if (uL != 0) @@ -637,8 +605,7 @@ local ZPOS64_T zip64local_SearchCentralDir64(const zlib_filefunc64_32_def* pzlib return relativeOffset; } -int LoadCentralDirectoryRecord(zip64_internal* pziinit) -{ +local int LoadCentralDirectoryRecord(zip64_internal* pziinit) { int err=ZIP_OK; ZPOS64_T byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/ @@ -647,10 +614,10 @@ int LoadCentralDirectoryRecord(zip64_internal* pziinit) ZPOS64_T central_pos; uLong uL; - uLong number_disk; /* number of the current dist, used for - spaning ZIP, unsupported, always 0*/ - uLong number_disk_with_CD; /* number the the disk with central dir, used - for spaning ZIP, unsupported, always 0*/ + uLong number_disk; /* number of the current disk, used for + spanning ZIP, unsupported, always 0*/ + uLong number_disk_with_CD; /* number of the disk with central dir, used + for spanning ZIP, unsupported, always 0*/ ZPOS64_T number_entry; ZPOS64_T number_entry_CD; /* total number of entries in the central dir @@ -830,7 +797,7 @@ int LoadCentralDirectoryRecord(zip64_internal* pziinit) size_central_dir_to_read-=read_this; } - TRYFREE(buf_read); + free(buf_read); } pziinit->begin_pos = byte_before_the_zipfile; pziinit->number_entry = number_entry_CD; @@ -846,8 +813,7 @@ int LoadCentralDirectoryRecord(zip64_internal* pziinit) /************************************************************/ -extern zipFile ZEXPORT zipOpen3 (const void *pathname, int append, zipcharpc* globalcomment, zlib_filefunc64_32_def* pzlib_filefunc64_32_def) -{ +extern zipFile ZEXPORT zipOpen3(const void *pathname, int append, zipcharpc* globalcomment, zlib_filefunc64_32_def* pzlib_filefunc64_32_def) { zip64_internal ziinit; zip64_internal* zi; int err=ZIP_OK; @@ -905,9 +871,9 @@ extern zipFile ZEXPORT zipOpen3 (const void *pathname, int append, zipcharpc* gl if (err != ZIP_OK) { # ifndef NO_ADDFILEINEXISTINGZIP - TRYFREE(ziinit.globalcomment); + free(ziinit.globalcomment); # endif /* !NO_ADDFILEINEXISTINGZIP*/ - TRYFREE(zi); + free(zi); return NULL; } else @@ -917,8 +883,7 @@ extern zipFile ZEXPORT zipOpen3 (const void *pathname, int append, zipcharpc* gl } } -extern zipFile ZEXPORT zipOpen2 (const char *pathname, int append, zipcharpc* globalcomment, zlib_filefunc_def* pzlib_filefunc32_def) -{ +extern zipFile ZEXPORT zipOpen2(const char *pathname, int append, zipcharpc* globalcomment, zlib_filefunc_def* pzlib_filefunc32_def) { if (pzlib_filefunc32_def != NULL) { zlib_filefunc64_32_def zlib_filefunc64_32_def_fill; @@ -929,8 +894,7 @@ extern zipFile ZEXPORT zipOpen2 (const char *pathname, int append, zipcharpc* gl return zipOpen3(pathname, append, globalcomment, NULL); } -extern zipFile ZEXPORT zipOpen2_64 (const void *pathname, int append, zipcharpc* globalcomment, zlib_filefunc64_def* pzlib_filefunc_def) -{ +extern zipFile ZEXPORT zipOpen2_64(const void *pathname, int append, zipcharpc* globalcomment, zlib_filefunc64_def* pzlib_filefunc_def) { if (pzlib_filefunc_def != NULL) { zlib_filefunc64_32_def zlib_filefunc64_32_def_fill; @@ -945,18 +909,15 @@ extern zipFile ZEXPORT zipOpen2_64 (const void *pathname, int append, zipcharpc* -extern zipFile ZEXPORT zipOpen (const char* pathname, int append) -{ +extern zipFile ZEXPORT zipOpen(const char* pathname, int append) { return zipOpen3((const void*)pathname,append,NULL,NULL); } -extern zipFile ZEXPORT zipOpen64 (const void* pathname, int append) -{ +extern zipFile ZEXPORT zipOpen64(const void* pathname, int append) { return zipOpen3(pathname,append,NULL,NULL); } -int Write_LocalFileHeader(zip64_internal* zi, const char* filename, uInt size_extrafield_local, const void* extrafield_local) -{ +local int Write_LocalFileHeader(zip64_internal* zi, const char* filename, uInt size_extrafield_local, const void* extrafield_local) { /* write the local header */ int err; uInt size_filename = (uInt)strlen(filename); @@ -1034,8 +995,8 @@ int Write_LocalFileHeader(zip64_internal* zi, const char* filename, uInt size_ex // Remember position of Zip64 extended info for the local file header. (needed when we update size after done with file) zi->ci.pos_zip64extrainfo = ZTELL64(zi->z_filefunc,zi->filestream); - err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (short)HeaderID,2); - err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (short)DataSize,2); + err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (ZPOS64_T)HeaderID,2); + err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (ZPOS64_T)DataSize,2); err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (ZPOS64_T)UncompressedSize,8); err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (ZPOS64_T)CompressedSize,8); @@ -1052,14 +1013,13 @@ int Write_LocalFileHeader(zip64_internal* zi, const char* filename, uInt size_ex It is not done here because then we need to realloc a new buffer since parameters are 'const' and I want to minimize unnecessary allocations. */ -extern int ZEXPORT zipOpenNewFileInZip4_64 (zipFile file, const char* filename, const zip_fileinfo* zipfi, - const void* extrafield_local, uInt size_extrafield_local, - const void* extrafield_global, uInt size_extrafield_global, - const char* comment, int method, int level, int raw, - int windowBits,int memLevel, int strategy, - const char* password, uLong crcForCrypting, - uLong versionMadeBy, uLong flagBase, int zip64) -{ +extern int ZEXPORT zipOpenNewFileInZip4_64(zipFile file, const char* filename, const zip_fileinfo* zipfi, + const void* extrafield_local, uInt size_extrafield_local, + const void* extrafield_global, uInt size_extrafield_global, + const char* comment, int method, int level, int raw, + int windowBits,int memLevel, int strategy, + const char* password, uLong crcForCrypting, + uLong versionMadeBy, uLong flagBase, int zip64) { zip64_internal* zi; uInt size_filename; uInt size_comment; @@ -1083,6 +1043,17 @@ extern int ZEXPORT zipOpenNewFileInZip4_64 (zipFile file, const char* filename, return ZIP_PARAMERROR; #endif + // The filename and comment length must fit in 16 bits. + if ((filename!=NULL) && (strlen(filename)>0xffff)) + return ZIP_PARAMERROR; + if ((comment!=NULL) && (strlen(comment)>0xffff)) + return ZIP_PARAMERROR; + // The extra field length must fit in 16 bits. If the member also requires + // a Zip64 extra block, that will also need to fit within that 16-bit + // length, but that will be checked for later. + if ((size_extrafield_local>0xffff) || (size_extrafield_global>0xffff)) + return ZIP_PARAMERROR; + zi = (zip64_internal*)file; if (zi->in_opened_file_inzip == 1) @@ -1262,35 +1233,33 @@ extern int ZEXPORT zipOpenNewFileInZip4_64 (zipFile file, const char* filename, return err; } -extern int ZEXPORT zipOpenNewFileInZip4 (zipFile file, const char* filename, const zip_fileinfo* zipfi, - const void* extrafield_local, uInt size_extrafield_local, - const void* extrafield_global, uInt size_extrafield_global, - const char* comment, int method, int level, int raw, - int windowBits,int memLevel, int strategy, - const char* password, uLong crcForCrypting, - uLong versionMadeBy, uLong flagBase) -{ - return zipOpenNewFileInZip4_64 (file, filename, zipfi, - extrafield_local, size_extrafield_local, - extrafield_global, size_extrafield_global, - comment, method, level, raw, - windowBits, memLevel, strategy, - password, crcForCrypting, versionMadeBy, flagBase, 0); +extern int ZEXPORT zipOpenNewFileInZip4(zipFile file, const char* filename, const zip_fileinfo* zipfi, + const void* extrafield_local, uInt size_extrafield_local, + const void* extrafield_global, uInt size_extrafield_global, + const char* comment, int method, int level, int raw, + int windowBits,int memLevel, int strategy, + const char* password, uLong crcForCrypting, + uLong versionMadeBy, uLong flagBase) { + return zipOpenNewFileInZip4_64(file, filename, zipfi, + extrafield_local, size_extrafield_local, + extrafield_global, size_extrafield_global, + comment, method, level, raw, + windowBits, memLevel, strategy, + password, crcForCrypting, versionMadeBy, flagBase, 0); } -extern int ZEXPORT zipOpenNewFileInZip3 (zipFile file, const char* filename, const zip_fileinfo* zipfi, - const void* extrafield_local, uInt size_extrafield_local, - const void* extrafield_global, uInt size_extrafield_global, - const char* comment, int method, int level, int raw, - int windowBits,int memLevel, int strategy, - const char* password, uLong crcForCrypting) -{ - return zipOpenNewFileInZip4_64 (file, filename, zipfi, - extrafield_local, size_extrafield_local, - extrafield_global, size_extrafield_global, - comment, method, level, raw, - windowBits, memLevel, strategy, - password, crcForCrypting, VERSIONMADEBY, 0, 0); +extern int ZEXPORT zipOpenNewFileInZip3(zipFile file, const char* filename, const zip_fileinfo* zipfi, + const void* extrafield_local, uInt size_extrafield_local, + const void* extrafield_global, uInt size_extrafield_global, + const char* comment, int method, int level, int raw, + int windowBits,int memLevel, int strategy, + const char* password, uLong crcForCrypting) { + return zipOpenNewFileInZip4_64(file, filename, zipfi, + extrafield_local, size_extrafield_local, + extrafield_global, size_extrafield_global, + comment, method, level, raw, + windowBits, memLevel, strategy, + password, crcForCrypting, VERSIONMADEBY, 0, 0); } extern int ZEXPORT zipOpenNewFileInZip3_64(zipFile file, const char* filename, const zip_fileinfo* zipfi, @@ -1298,70 +1267,64 @@ extern int ZEXPORT zipOpenNewFileInZip3_64(zipFile file, const char* filename, c const void* extrafield_global, uInt size_extrafield_global, const char* comment, int method, int level, int raw, int windowBits,int memLevel, int strategy, - const char* password, uLong crcForCrypting, int zip64) -{ - return zipOpenNewFileInZip4_64 (file, filename, zipfi, - extrafield_local, size_extrafield_local, - extrafield_global, size_extrafield_global, - comment, method, level, raw, - windowBits, memLevel, strategy, - password, crcForCrypting, VERSIONMADEBY, 0, zip64); + const char* password, uLong crcForCrypting, int zip64) { + return zipOpenNewFileInZip4_64(file, filename, zipfi, + extrafield_local, size_extrafield_local, + extrafield_global, size_extrafield_global, + comment, method, level, raw, + windowBits, memLevel, strategy, + password, crcForCrypting, VERSIONMADEBY, 0, zip64); } extern int ZEXPORT zipOpenNewFileInZip2(zipFile file, const char* filename, const zip_fileinfo* zipfi, const void* extrafield_local, uInt size_extrafield_local, const void* extrafield_global, uInt size_extrafield_global, - const char* comment, int method, int level, int raw) -{ - return zipOpenNewFileInZip4_64 (file, filename, zipfi, - extrafield_local, size_extrafield_local, - extrafield_global, size_extrafield_global, - comment, method, level, raw, - -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, - NULL, 0, VERSIONMADEBY, 0, 0); + const char* comment, int method, int level, int raw) { + return zipOpenNewFileInZip4_64(file, filename, zipfi, + extrafield_local, size_extrafield_local, + extrafield_global, size_extrafield_global, + comment, method, level, raw, + -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, + NULL, 0, VERSIONMADEBY, 0, 0); } extern int ZEXPORT zipOpenNewFileInZip2_64(zipFile file, const char* filename, const zip_fileinfo* zipfi, - const void* extrafield_local, uInt size_extrafield_local, - const void* extrafield_global, uInt size_extrafield_global, - const char* comment, int method, int level, int raw, int zip64) -{ - return zipOpenNewFileInZip4_64 (file, filename, zipfi, - extrafield_local, size_extrafield_local, - extrafield_global, size_extrafield_global, - comment, method, level, raw, - -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, - NULL, 0, VERSIONMADEBY, 0, zip64); + const void* extrafield_local, uInt size_extrafield_local, + const void* extrafield_global, uInt size_extrafield_global, + const char* comment, int method, int level, int raw, int zip64) { + return zipOpenNewFileInZip4_64(file, filename, zipfi, + extrafield_local, size_extrafield_local, + extrafield_global, size_extrafield_global, + comment, method, level, raw, + -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, + NULL, 0, VERSIONMADEBY, 0, zip64); } -extern int ZEXPORT zipOpenNewFileInZip64 (zipFile file, const char* filename, const zip_fileinfo* zipfi, - const void* extrafield_local, uInt size_extrafield_local, - const void*extrafield_global, uInt size_extrafield_global, - const char* comment, int method, int level, int zip64) -{ - return zipOpenNewFileInZip4_64 (file, filename, zipfi, - extrafield_local, size_extrafield_local, - extrafield_global, size_extrafield_global, - comment, method, level, 0, - -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, - NULL, 0, VERSIONMADEBY, 0, zip64); +extern int ZEXPORT zipOpenNewFileInZip64(zipFile file, const char* filename, const zip_fileinfo* zipfi, + const void* extrafield_local, uInt size_extrafield_local, + const void*extrafield_global, uInt size_extrafield_global, + const char* comment, int method, int level, int zip64) { + return zipOpenNewFileInZip4_64(file, filename, zipfi, + extrafield_local, size_extrafield_local, + extrafield_global, size_extrafield_global, + comment, method, level, 0, + -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, + NULL, 0, VERSIONMADEBY, 0, zip64); } -extern int ZEXPORT zipOpenNewFileInZip (zipFile file, const char* filename, const zip_fileinfo* zipfi, - const void* extrafield_local, uInt size_extrafield_local, - const void*extrafield_global, uInt size_extrafield_global, - const char* comment, int method, int level) -{ - return zipOpenNewFileInZip4_64 (file, filename, zipfi, - extrafield_local, size_extrafield_local, - extrafield_global, size_extrafield_global, - comment, method, level, 0, - -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, - NULL, 0, VERSIONMADEBY, 0, 0); +extern int ZEXPORT zipOpenNewFileInZip(zipFile file, const char* filename, const zip_fileinfo* zipfi, + const void* extrafield_local, uInt size_extrafield_local, + const void*extrafield_global, uInt size_extrafield_global, + const char* comment, int method, int level) { + return zipOpenNewFileInZip4_64(file, filename, zipfi, + extrafield_local, size_extrafield_local, + extrafield_global, size_extrafield_global, + comment, method, level, 0, + -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, + NULL, 0, VERSIONMADEBY, 0, 0); } -local int zip64FlushWriteBuffer(zip64_internal* zi) -{ +local int zip64FlushWriteBuffer(zip64_internal* zi) { int err=ZIP_OK; if (zi->ci.encrypt != 0) @@ -1399,8 +1362,7 @@ local int zip64FlushWriteBuffer(zip64_internal* zi) return err; } -extern int ZEXPORT zipWriteInFileInZip (zipFile file,const void* buf,unsigned int len) -{ +extern int ZEXPORT zipWriteInFileInZip(zipFile file, const void* buf, unsigned int len) { zip64_internal* zi; int err=ZIP_OK; @@ -1450,7 +1412,7 @@ extern int ZEXPORT zipWriteInFileInZip (zipFile file,const void* buf,unsigned in else #endif { - zi->ci.stream.next_in = (Bytef*)buf; + zi->ci.stream.next_in = (Bytef*)(uintptr_t)buf; zi->ci.stream.avail_in = len; while ((err==ZIP_OK) && (zi->ci.stream.avail_in>0)) @@ -1471,11 +1433,6 @@ extern int ZEXPORT zipWriteInFileInZip (zipFile file,const void* buf,unsigned in { uLong uTotalOutBefore = zi->ci.stream.total_out; err=deflate(&zi->ci.stream, Z_NO_FLUSH); - if(uTotalOutBefore > zi->ci.stream.total_out) - { - int bBreak = 0; - bBreak++; - } zi->ci.pos_in_buffered_data += (uInt)(zi->ci.stream.total_out - uTotalOutBefore) ; } @@ -1506,17 +1463,15 @@ extern int ZEXPORT zipWriteInFileInZip (zipFile file,const void* buf,unsigned in return err; } -extern int ZEXPORT zipCloseFileInZipRaw (zipFile file, uLong uncompressed_size, uLong crc32) -{ +extern int ZEXPORT zipCloseFileInZipRaw(zipFile file, uLong uncompressed_size, uLong crc32) { return zipCloseFileInZipRaw64 (file, uncompressed_size, crc32); } -extern int ZEXPORT zipCloseFileInZipRaw64 (zipFile file, ZPOS64_T uncompressed_size, uLong crc32) -{ +extern int ZEXPORT zipCloseFileInZipRaw64(zipFile file, ZPOS64_T uncompressed_size, uLong crc32) { zip64_internal* zi; ZPOS64_T compressed_size; uLong invalidValue = 0xffffffff; - short datasize = 0; + unsigned datasize = 0; int err=ZIP_OK; if (file == NULL) @@ -1653,7 +1608,7 @@ extern int ZEXPORT zipCloseFileInZipRaw64 (zipFile file, ZPOS64_T uncompressed_s if((uLong)(datasize + 4) > zi->ci.size_centralExtraFree) { - // we can not write more data to the buffer that we have room for. + // we cannot write more data to the buffer that we have room for. return ZIP_BADZIPFILE; } @@ -1747,13 +1702,11 @@ extern int ZEXPORT zipCloseFileInZipRaw64 (zipFile file, ZPOS64_T uncompressed_s return err; } -extern int ZEXPORT zipCloseFileInZip (zipFile file) -{ +extern int ZEXPORT zipCloseFileInZip(zipFile file) { return zipCloseFileInZipRaw (file,0,0); } -int Write_Zip64EndOfCentralDirectoryLocator(zip64_internal* zi, ZPOS64_T zip64eocd_pos_inzip) -{ +local int Write_Zip64EndOfCentralDirectoryLocator(zip64_internal* zi, ZPOS64_T zip64eocd_pos_inzip) { int err = ZIP_OK; ZPOS64_T pos = zip64eocd_pos_inzip - zi->add_position_when_writing_offset; @@ -1774,8 +1727,7 @@ int Write_Zip64EndOfCentralDirectoryLocator(zip64_internal* zi, ZPOS64_T zip64eo return err; } -int Write_Zip64EndOfCentralDirectoryRecord(zip64_internal* zi, uLong size_centraldir, ZPOS64_T centraldir_pos_inzip) -{ +local int Write_Zip64EndOfCentralDirectoryRecord(zip64_internal* zi, uLong size_centraldir, ZPOS64_T centraldir_pos_inzip) { int err = ZIP_OK; uLong Zip64DataSize = 44; @@ -1813,8 +1765,8 @@ int Write_Zip64EndOfCentralDirectoryRecord(zip64_internal* zi, uLong size_centra } return err; } -int Write_EndOfCentralDirectoryRecord(zip64_internal* zi, uLong size_centraldir, ZPOS64_T centraldir_pos_inzip) -{ + +local int Write_EndOfCentralDirectoryRecord(zip64_internal* zi, uLong size_centraldir, ZPOS64_T centraldir_pos_inzip) { int err = ZIP_OK; /*signature*/ @@ -1861,8 +1813,7 @@ int Write_EndOfCentralDirectoryRecord(zip64_internal* zi, uLong size_centraldir, return err; } -int Write_GlobalComment(zip64_internal* zi, const char* global_comment) -{ +local int Write_GlobalComment(zip64_internal* zi, const char* global_comment) { int err = ZIP_OK; uInt size_global_comment = 0; @@ -1879,8 +1830,7 @@ int Write_GlobalComment(zip64_internal* zi, const char* global_comment) return err; } -extern int ZEXPORT zipClose (zipFile file, const char* global_comment) -{ +extern int ZEXPORT zipClose(zipFile file, const char* global_comment) { zip64_internal* zi; int err = 0; uLong size_centraldir = 0; @@ -1922,7 +1872,7 @@ extern int ZEXPORT zipClose (zipFile file, const char* global_comment) free_linkedlist(&(zi->central_dir)); pos = centraldir_pos_inzip - zi->add_position_when_writing_offset; - if(pos >= 0xffffffff || zi->number_entry > 0xFFFF) + if(pos >= 0xffffffff || zi->number_entry >= 0xFFFF) { ZPOS64_T Zip64EOCDpos = ZTELL64(zi->z_filefunc,zi->filestream); Write_Zip64EndOfCentralDirectoryRecord(zi, size_centraldir, centraldir_pos_inzip); @@ -1941,15 +1891,14 @@ extern int ZEXPORT zipClose (zipFile file, const char* global_comment) err = ZIP_ERRNO; #ifndef NO_ADDFILEINEXISTINGZIP - TRYFREE(zi->globalcomment); + free(zi->globalcomment); #endif - TRYFREE(zi); + free(zi); return err; } -extern int ZEXPORT zipRemoveExtraInfoBlock (char* pData, int* dataLen, short sHeader) -{ +extern int ZEXPORT zipRemoveExtraInfoBlock(char* pData, int* dataLen, short sHeader) { char* p = pData; int size = 0; char* pNewHeader; @@ -1959,10 +1908,10 @@ extern int ZEXPORT zipRemoveExtraInfoBlock (char* pData, int* dataLen, short sHe int retVal = ZIP_OK; - if(pData == NULL || *dataLen < 4) + if(pData == NULL || dataLen == NULL || *dataLen < 4) return ZIP_PARAMERROR; - pNewHeader = (char*)ALLOC(*dataLen); + pNewHeader = (char*)ALLOC((unsigned)*dataLen); pTmp = pNewHeader; while(p < (pData + *dataLen)) @@ -2001,7 +1950,7 @@ extern int ZEXPORT zipRemoveExtraInfoBlock (char* pData, int* dataLen, short sHe else retVal = ZIP_ERRNO; - TRYFREE(pNewHeader); + free(pNewHeader); return retVal; } diff --git a/zlib/contrib/minizip/zip.h b/zlib/contrib/minizip/zip.h index 8aaebb623430..3e230d3405f6 100644 --- a/zlib/contrib/minizip/zip.h +++ b/zlib/contrib/minizip/zip.h @@ -88,12 +88,12 @@ typedef voidp zipFile; /* tm_zip contain date/time info */ typedef struct tm_zip_s { - uInt tm_sec; /* seconds after the minute - [0,59] */ - uInt tm_min; /* minutes after the hour - [0,59] */ - uInt tm_hour; /* hours since midnight - [0,23] */ - uInt tm_mday; /* day of the month - [1,31] */ - uInt tm_mon; /* months since January - [0,11] */ - uInt tm_year; /* years - [1980..2044] */ + int tm_sec; /* seconds after the minute - [0,59] */ + int tm_min; /* minutes after the hour - [0,59] */ + int tm_hour; /* hours since midnight - [0,23] */ + int tm_mday; /* day of the month - [1,31] */ + int tm_mon; /* months since January - [0,11] */ + int tm_year; /* years - [1980..2044] */ } tm_zip; typedef struct @@ -113,8 +113,8 @@ typedef const char* zipcharpc; #define APPEND_STATUS_CREATEAFTER (1) #define APPEND_STATUS_ADDINZIP (2) -extern zipFile ZEXPORT zipOpen OF((const char *pathname, int append)); -extern zipFile ZEXPORT zipOpen64 OF((const void *pathname, int append)); +extern zipFile ZEXPORT zipOpen(const char *pathname, int append); +extern zipFile ZEXPORT zipOpen64(const void *pathname, int append); /* Create a zipfile. pathname contain on Windows XP a filename like "c:\\zlib\\zlib113.zip" or on @@ -131,50 +131,55 @@ extern zipFile ZEXPORT zipOpen64 OF((const void *pathname, int append)); /* Note : there is no delete function into a zipfile. If you want delete file into a zipfile, you must open a zipfile, and create another - Of couse, you can use RAW reading and writing to copy the file you did not want delte + Of course, you can use RAW reading and writing to copy the file you did not want delete */ -extern zipFile ZEXPORT zipOpen2 OF((const char *pathname, - int append, - zipcharpc* globalcomment, - zlib_filefunc_def* pzlib_filefunc_def)); +extern zipFile ZEXPORT zipOpen2(const char *pathname, + int append, + zipcharpc* globalcomment, + zlib_filefunc_def* pzlib_filefunc_def); -extern zipFile ZEXPORT zipOpen2_64 OF((const void *pathname, +extern zipFile ZEXPORT zipOpen2_64(const void *pathname, int append, zipcharpc* globalcomment, - zlib_filefunc64_def* pzlib_filefunc_def)); - -extern int ZEXPORT zipOpenNewFileInZip OF((zipFile file, - const char* filename, - const zip_fileinfo* zipfi, - const void* extrafield_local, - uInt size_extrafield_local, - const void* extrafield_global, - uInt size_extrafield_global, - const char* comment, - int method, - int level)); - -extern int ZEXPORT zipOpenNewFileInZip64 OF((zipFile file, - const char* filename, - const zip_fileinfo* zipfi, - const void* extrafield_local, - uInt size_extrafield_local, - const void* extrafield_global, - uInt size_extrafield_global, - const char* comment, - int method, - int level, - int zip64)); + zlib_filefunc64_def* pzlib_filefunc_def); + +extern zipFile ZEXPORT zipOpen3(const void *pathname, + int append, + zipcharpc* globalcomment, + zlib_filefunc64_32_def* pzlib_filefunc64_32_def); + +extern int ZEXPORT zipOpenNewFileInZip(zipFile file, + const char* filename, + const zip_fileinfo* zipfi, + const void* extrafield_local, + uInt size_extrafield_local, + const void* extrafield_global, + uInt size_extrafield_global, + const char* comment, + int method, + int level); + +extern int ZEXPORT zipOpenNewFileInZip64(zipFile file, + const char* filename, + const zip_fileinfo* zipfi, + const void* extrafield_local, + uInt size_extrafield_local, + const void* extrafield_global, + uInt size_extrafield_global, + const char* comment, + int method, + int level, + int zip64); /* Open a file in the ZIP for writing. filename : the filename in zip (if NULL, '-' without quote will be used *zipfi contain supplemental information if extrafield_local!=NULL and size_extrafield_local>0, extrafield_local - contains the extrafield data the the local header + contains the extrafield data for the local header if extrafield_global!=NULL and size_extrafield_global>0, extrafield_global - contains the extrafield data the the local header + contains the extrafield data for the global header if comment != NULL, comment contain the comment string method contain the compression method (0 for store, Z_DEFLATED for deflate) level contain the level of compression (can be Z_DEFAULT_COMPRESSION) @@ -184,70 +189,69 @@ extern int ZEXPORT zipOpenNewFileInZip64 OF((zipFile file, */ -extern int ZEXPORT zipOpenNewFileInZip2 OF((zipFile file, - const char* filename, - const zip_fileinfo* zipfi, - const void* extrafield_local, - uInt size_extrafield_local, - const void* extrafield_global, - uInt size_extrafield_global, - const char* comment, - int method, - int level, - int raw)); - - -extern int ZEXPORT zipOpenNewFileInZip2_64 OF((zipFile file, - const char* filename, - const zip_fileinfo* zipfi, - const void* extrafield_local, - uInt size_extrafield_local, - const void* extrafield_global, - uInt size_extrafield_global, - const char* comment, - int method, - int level, - int raw, - int zip64)); +extern int ZEXPORT zipOpenNewFileInZip2(zipFile file, + const char* filename, + const zip_fileinfo* zipfi, + const void* extrafield_local, + uInt size_extrafield_local, + const void* extrafield_global, + uInt size_extrafield_global, + const char* comment, + int method, + int level, + int raw); + + +extern int ZEXPORT zipOpenNewFileInZip2_64(zipFile file, + const char* filename, + const zip_fileinfo* zipfi, + const void* extrafield_local, + uInt size_extrafield_local, + const void* extrafield_global, + uInt size_extrafield_global, + const char* comment, + int method, + int level, + int raw, + int zip64); /* Same than zipOpenNewFileInZip, except if raw=1, we write raw file */ -extern int ZEXPORT zipOpenNewFileInZip3 OF((zipFile file, - const char* filename, - const zip_fileinfo* zipfi, - const void* extrafield_local, - uInt size_extrafield_local, - const void* extrafield_global, - uInt size_extrafield_global, - const char* comment, - int method, - int level, - int raw, - int windowBits, - int memLevel, - int strategy, - const char* password, - uLong crcForCrypting)); - -extern int ZEXPORT zipOpenNewFileInZip3_64 OF((zipFile file, - const char* filename, - const zip_fileinfo* zipfi, - const void* extrafield_local, - uInt size_extrafield_local, - const void* extrafield_global, - uInt size_extrafield_global, - const char* comment, - int method, - int level, - int raw, - int windowBits, - int memLevel, - int strategy, - const char* password, - uLong crcForCrypting, - int zip64 - )); +extern int ZEXPORT zipOpenNewFileInZip3(zipFile file, + const char* filename, + const zip_fileinfo* zipfi, + const void* extrafield_local, + uInt size_extrafield_local, + const void* extrafield_global, + uInt size_extrafield_global, + const char* comment, + int method, + int level, + int raw, + int windowBits, + int memLevel, + int strategy, + const char* password, + uLong crcForCrypting); + +extern int ZEXPORT zipOpenNewFileInZip3_64(zipFile file, + const char* filename, + const zip_fileinfo* zipfi, + const void* extrafield_local, + uInt size_extrafield_local, + const void* extrafield_global, + uInt size_extrafield_global, + const char* comment, + int method, + int level, + int raw, + int windowBits, + int memLevel, + int strategy, + const char* password, + uLong crcForCrypting, + int zip64); /* Same than zipOpenNewFileInZip2, except @@ -256,47 +260,45 @@ extern int ZEXPORT zipOpenNewFileInZip3_64 OF((zipFile file, crcForCrypting : crc of file to compress (needed for crypting) */ -extern int ZEXPORT zipOpenNewFileInZip4 OF((zipFile file, - const char* filename, - const zip_fileinfo* zipfi, - const void* extrafield_local, - uInt size_extrafield_local, - const void* extrafield_global, - uInt size_extrafield_global, - const char* comment, - int method, - int level, - int raw, - int windowBits, - int memLevel, - int strategy, - const char* password, - uLong crcForCrypting, - uLong versionMadeBy, - uLong flagBase - )); - - -extern int ZEXPORT zipOpenNewFileInZip4_64 OF((zipFile file, - const char* filename, - const zip_fileinfo* zipfi, - const void* extrafield_local, - uInt size_extrafield_local, - const void* extrafield_global, - uInt size_extrafield_global, - const char* comment, - int method, - int level, - int raw, - int windowBits, - int memLevel, - int strategy, - const char* password, - uLong crcForCrypting, - uLong versionMadeBy, - uLong flagBase, - int zip64 - )); +extern int ZEXPORT zipOpenNewFileInZip4(zipFile file, + const char* filename, + const zip_fileinfo* zipfi, + const void* extrafield_local, + uInt size_extrafield_local, + const void* extrafield_global, + uInt size_extrafield_global, + const char* comment, + int method, + int level, + int raw, + int windowBits, + int memLevel, + int strategy, + const char* password, + uLong crcForCrypting, + uLong versionMadeBy, + uLong flagBase); + + +extern int ZEXPORT zipOpenNewFileInZip4_64(zipFile file, + const char* filename, + const zip_fileinfo* zipfi, + const void* extrafield_local, + uInt size_extrafield_local, + const void* extrafield_global, + uInt size_extrafield_global, + const char* comment, + int method, + int level, + int raw, + int windowBits, + int memLevel, + int strategy, + const char* password, + uLong crcForCrypting, + uLong versionMadeBy, + uLong flagBase, + int zip64); /* Same than zipOpenNewFileInZip4, except versionMadeBy : value for Version made by field @@ -304,25 +306,25 @@ extern int ZEXPORT zipOpenNewFileInZip4_64 OF((zipFile file, */ -extern int ZEXPORT zipWriteInFileInZip OF((zipFile file, - const void* buf, - unsigned len)); +extern int ZEXPORT zipWriteInFileInZip(zipFile file, + const void* buf, + unsigned len); /* Write data in the zipfile */ -extern int ZEXPORT zipCloseFileInZip OF((zipFile file)); +extern int ZEXPORT zipCloseFileInZip(zipFile file); /* Close the current file in the zipfile */ -extern int ZEXPORT zipCloseFileInZipRaw OF((zipFile file, - uLong uncompressed_size, - uLong crc32)); +extern int ZEXPORT zipCloseFileInZipRaw(zipFile file, + uLong uncompressed_size, + uLong crc32); -extern int ZEXPORT zipCloseFileInZipRaw64 OF((zipFile file, - ZPOS64_T uncompressed_size, - uLong crc32)); +extern int ZEXPORT zipCloseFileInZipRaw64(zipFile file, + ZPOS64_T uncompressed_size, + uLong crc32); /* Close the current file in the zipfile, for file opened with @@ -330,14 +332,14 @@ extern int ZEXPORT zipCloseFileInZipRaw64 OF((zipFile file, uncompressed_size and crc32 are value for the uncompressed size */ -extern int ZEXPORT zipClose OF((zipFile file, - const char* global_comment)); +extern int ZEXPORT zipClose(zipFile file, + const char* global_comment); /* Close the zipfile */ -extern int ZEXPORT zipRemoveExtraInfoBlock OF((char* pData, int* dataLen, short sHeader)); +extern int ZEXPORT zipRemoveExtraInfoBlock(char* pData, int* dataLen, short sHeader); /* zipRemoveExtraInfoBlock - Added by Mathias Svensson diff --git a/zlib/contrib/nuget/nuget.csproj b/zlib/contrib/nuget/nuget.csproj new file mode 100644 index 000000000000..68627f034aaf --- /dev/null +++ b/zlib/contrib/nuget/nuget.csproj @@ -0,0 +1,43 @@ + + + + net6.0 + madler.zlib.redist + $(PackageId).win + $(PackageId).linux + $(PackageId).osx + (C) 1995-2024 Jean-loup Gailly and Mark Adler + 1.3.1 + NuGet Package for consuming native builds of zlib into .NET without complexity. + + NU5128 + $(MSBuildProjectDirectory) + Jean-loup Gailly and Mark Adler + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/zlib/contrib/nuget/nuget.sln b/zlib/contrib/nuget/nuget.sln new file mode 100644 index 000000000000..46ee8deab8f2 --- /dev/null +++ b/zlib/contrib/nuget/nuget.sln @@ -0,0 +1,22 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.0.31903.59 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nuget", "nuget.csproj", "{B1BD3984-EF8F-4E9D-9A94-EB784E5EB1E8}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {B1BD3984-EF8F-4E9D-9A94-EB784E5EB1E8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B1BD3984-EF8F-4E9D-9A94-EB784E5EB1E8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B1BD3984-EF8F-4E9D-9A94-EB784E5EB1E8}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B1BD3984-EF8F-4E9D-9A94-EB784E5EB1E8}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection +EndGlobal diff --git a/zlib/contrib/pascal/zlibpas.pas b/zlib/contrib/pascal/zlibpas.pas index a0dff11b505f..0cf0e7b82dc0 100644 --- a/zlib/contrib/pascal/zlibpas.pas +++ b/zlib/contrib/pascal/zlibpas.pas @@ -10,7 +10,7 @@ unit zlibpas; interface const - ZLIB_VERSION = '1.2.11'; + ZLIB_VERSION = '1.3.1'; ZLIB_VERNUM = $12a0; type diff --git a/zlib/contrib/puff/README b/zlib/contrib/puff/README index bbc4cb595ec1..d8192c78747e 100644 --- a/zlib/contrib/puff/README +++ b/zlib/contrib/puff/README @@ -38,7 +38,7 @@ Then you can call puff() to decompress a deflate stream that is in memory in its entirety at source, to a sufficiently sized block of memory for the decompressed data at dest. puff() is the only external symbol in puff.c The only C library functions that puff.c needs are setjmp() and longjmp(), which -are used to simplify error checking in the code to improve readabilty. puff.c +are used to simplify error checking in the code to improve readability. puff.c does no memory allocation, and uses less than 2K bytes off of the stack. If destlen is not enough space for the uncompressed data, then inflate will diff --git a/zlib/contrib/puff/puff.c b/zlib/contrib/puff/puff.c index c6c90d714206..d759825ab1d7 100644 --- a/zlib/contrib/puff/puff.c +++ b/zlib/contrib/puff/puff.c @@ -43,7 +43,7 @@ * - Use pointers instead of long to specify source and * destination sizes to avoid arbitrary 4 GB limits * 1.2 17 Mar 2002 - Add faster version of decode(), doubles speed (!), - * but leave simple version for readabilty + * but leave simple version for readability * - Make sure invalid distances detected if pointers * are 16 bits * - Fix fixed codes table error @@ -593,10 +593,10 @@ local int fixed(struct state *s) * provided for each of the literal/length symbols, and for each of the * distance symbols. * - * - If a symbol is not used in the block, this is represented by a zero as - * as the code length. This does not mean a zero-length code, but rather - * that no code should be created for this symbol. There is no way in the - * deflate format to represent a zero-length code. + * - If a symbol is not used in the block, this is represented by a zero as the + * code length. This does not mean a zero-length code, but rather that no + * code should be created for this symbol. There is no way in the deflate + * format to represent a zero-length code. * * - The maximum number of bits in a code is 15, so the possible lengths for * any code are 1..15. @@ -624,7 +624,7 @@ local int fixed(struct state *s) * are themselves compressed using Huffman codes and run-length encoding. In * the list of code lengths, a 0 symbol means no code, a 1..15 symbol means * that length, and the symbols 16, 17, and 18 are run-length instructions. - * Each of 16, 17, and 18 are follwed by extra bits to define the length of + * Each of 16, 17, and 18 are followed by extra bits to define the length of * the run. 16 copies the last length 3 to 6 times. 17 represents 3 to 10 * zero lengths, and 18 represents 11 to 138 zero lengths. Unused symbols * are common, hence the special coding for zero lengths. diff --git a/zlib/contrib/puff/pufftest.c b/zlib/contrib/puff/pufftest.c index 776481488c90..5f72ecc82764 100644 --- a/zlib/contrib/puff/pufftest.c +++ b/zlib/contrib/puff/pufftest.c @@ -143,7 +143,7 @@ int main(int argc, char **argv) len - sourcelen); } - /* if requested, inflate again and write decompressd data to stdout */ + /* if requested, inflate again and write decompressed data to stdout */ if (put && ret == 0) { if (fail) destlen >>= 1; diff --git a/zlib/contrib/puff/zeros.raw b/zlib/contrib/puff/zeros.raw index 637b7be6f5bfd577cec5537aaad160cc5fc0a7c7..0a90e76b300205a44a0ecbf613e64aaaef2e51e7 100644 GIT binary patch literal 2517 zc-l)!kYHV$AkxzmXu#!mP=i#?5{3o^3jqcYc(h-NVHAvlQ7{UICfLNzt^%T){_W3m tU%&(tHV|guWcc4lno_9RH9Zl#yW+jDk@x3I;zYkN^O0t_J-8 diff --git a/zlib/contrib/testzlib/testzlib.c b/zlib/contrib/testzlib/testzlib.c index 5f659dea00f6..b3c0014f9bc2 100644 --- a/zlib/contrib/testzlib/testzlib.c +++ b/zlib/contrib/testzlib/testzlib.c @@ -169,7 +169,7 @@ int main(int argc, char *argv[]) printf("error reading %s\n",argv[1]); return 1; } - else printf("file %s read, %u bytes\n",argv[1],lFileSize); + else printf("file %s read, %ld bytes\n",argv[1],lFileSize); if (argc>=3) BlockSizeCompress=atol(argv[2]); diff --git a/zlib/contrib/untgz/untgz.c b/zlib/contrib/untgz/untgz.c index 2c391e598675..78579211feca 100644 --- a/zlib/contrib/untgz/untgz.c +++ b/zlib/contrib/untgz/untgz.c @@ -4,6 +4,22 @@ * written by Pedro A. Aranda Gutierrez * adaptation to Unix by Jean-loup Gailly * various fixes by Cosmin Truta + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. */ #include @@ -14,15 +30,10 @@ #include "zlib.h" -#ifdef unix -# include -#else +#ifdef _WIN32 # include # include -#endif - -#ifdef WIN32 -#include +# include # ifndef F_OK # define F_OK 0 # endif @@ -33,6 +44,8 @@ # define strdup(str) _strdup(str) # endif #else +# include +# include # include #endif @@ -102,28 +115,14 @@ struct attr_item enum { TGZ_EXTRACT, TGZ_LIST, TGZ_INVALID }; -char *TGZfname OF((const char *)); -void TGZnotfound OF((const char *)); - -int getoct OF((char *, int)); -char *strtime OF((time_t *)); -int setfiletime OF((char *, time_t)); -void push_attr OF((struct attr_item **, char *, int, time_t)); -void restore_attr OF((struct attr_item **)); - -int ExprMatch OF((char *, char *)); - -int makedir OF((char *)); -int matchname OF((int, int, char **, char *)); - -void error OF((const char *)); -int tar OF((gzFile, int, int, int, char **)); - -void help OF((int)); -int main OF((int, char **)); - char *prog; +void error(const char *msg) +{ + fprintf(stderr, "%s: %s\n", prog, msg); + exit(1); +} + const char *TGZsuffix[] = { "\0", ".tar", ".tar.gz", ".taz", ".tgz", NULL }; /* return the file name of the TGZ archive */ @@ -205,7 +204,7 @@ char *strtime (time_t *t) int setfiletime (char *fname,time_t ftime) { -#ifdef WIN32 +#ifdef _WIN32 static int isWinNT = -1; SYSTEMTIME st; FILETIME locft, modft; @@ -590,12 +589,6 @@ void help(int exitval) exit(exitval); } -void error(const char *msg) -{ - fprintf(stderr, "%s: %s\n", prog, msg); - exit(1); -} - /* ============================================================ */ @@ -608,7 +601,7 @@ int main(int argc,char **argv) int action = TGZ_EXTRACT; int arg = 1; char *TGZfile; - gzFile *f; + gzFile f; prog = strrchr(argv[0],'\\'); if (prog == NULL) diff --git a/zlib/contrib/vstudio/readme.txt b/zlib/contrib/vstudio/readme.txt index f67eae8678a2..061bbc0e2d7c 100644 --- a/zlib/contrib/vstudio/readme.txt +++ b/zlib/contrib/vstudio/readme.txt @@ -1,78 +1,81 @@ -Building instructions for the DLL versions of Zlib 1.2.11 -======================================================== - -This directory contains projects that build zlib and minizip using -Microsoft Visual C++ 9.0/10.0. - -You don't need to build these projects yourself. You can download the -binaries from: - http://www.winimage.com/zLibDll - -More information can be found at this site. - - - - - -Build instructions for Visual Studio 2008 (32 bits or 64 bits) --------------------------------------------------------------- -- Decompress current zlib, including all contrib/* files -- Compile assembly code (with Visual Studio Command Prompt) by running: - bld_ml64.bat (in contrib\masmx64) - bld_ml32.bat (in contrib\masmx86) -- Open contrib\vstudio\vc9\zlibvc.sln with Microsoft Visual C++ 2008 -- Or run: vcbuild /rebuild contrib\vstudio\vc9\zlibvc.sln "Release|Win32" - -Build instructions for Visual Studio 2010 (32 bits or 64 bits) --------------------------------------------------------------- -- Decompress current zlib, including all contrib/* files -- Open contrib\vstudio\vc10\zlibvc.sln with Microsoft Visual C++ 2010 - -Build instructions for Visual Studio 2012 (32 bits or 64 bits) --------------------------------------------------------------- -- Decompress current zlib, including all contrib/* files -- Open contrib\vstudio\vc11\zlibvc.sln with Microsoft Visual C++ 2012 - -Build instructions for Visual Studio 2013 (32 bits or 64 bits) --------------------------------------------------------------- -- Decompress current zlib, including all contrib/* files -- Open contrib\vstudio\vc12\zlibvc.sln with Microsoft Visual C++ 2013 - -Build instructions for Visual Studio 2015 (32 bits or 64 bits) --------------------------------------------------------------- -- Decompress current zlib, including all contrib/* files -- Open contrib\vstudio\vc14\zlibvc.sln with Microsoft Visual C++ 2015 - - -Important ---------- -- To use zlibwapi.dll in your application, you must define the - macro ZLIB_WINAPI when compiling your application's source files. - - -Additional notes ----------------- -- This DLL, named zlibwapi.dll, is compatible to the old zlib.dll built - by Gilles Vollant from the zlib 1.1.x sources, and distributed at - http://www.winimage.com/zLibDll - It uses the WINAPI calling convention for the exported functions, and - includes the minizip functionality. If your application needs that - particular build of zlib.dll, you can rename zlibwapi.dll to zlib.dll. - -- The new DLL was renamed because there exist several incompatible - versions of zlib.dll on the Internet. - -- There is also an official DLL build of zlib, named zlib1.dll. This one - is exporting the functions using the CDECL convention. See the file - win32\DLL_FAQ.txt found in this zlib distribution. - -- There used to be a ZLIB_DLL macro in zlib 1.1.x, but now this symbol - has a slightly different effect. To avoid compatibility problems, do - not define it here. - - -Gilles Vollant -info@winimage.com - -Visual Studio 2013 and 2015 Projects from Sean Hunt -seandhunt_7@yahoo.com +Building instructions for the DLL versions of Zlib 1.3.1 +======================================================== + +This directory contains projects that build zlib and minizip using +Microsoft Visual C++ 9.0/10.0. + +You don't need to build these projects yourself. You can download the +binaries from: + http://www.winimage.com/zLibDll + +More information can be found at this site. + + + + + +Build instructions for Visual Studio 2008 (32 bits or 64 bits) +-------------------------------------------------------------- +- Decompress current zlib, including all contrib/* files +- Open contrib\vstudio\vc9\zlibvc.sln with Microsoft Visual C++ 2008 +- Or run: vcbuild /rebuild contrib\vstudio\vc9\zlibvc.sln "Release|Win32" + +Build instructions for Visual Studio 2010 (32 bits or 64 bits) +-------------------------------------------------------------- +- Decompress current zlib, including all contrib/* files +- Open contrib\vstudio\vc10\zlibvc.sln with Microsoft Visual C++ 2010 + +Build instructions for Visual Studio 2012 (32 bits or 64 bits) +-------------------------------------------------------------- +- Decompress current zlib, including all contrib/* files +- Open contrib\vstudio\vc11\zlibvc.sln with Microsoft Visual C++ 2012 + +Build instructions for Visual Studio 2013 (32 bits or 64 bits) +-------------------------------------------------------------- +- Decompress current zlib, including all contrib/* files +- Open contrib\vstudio\vc12\zlibvc.sln with Microsoft Visual C++ 2013 + +Build instructions for Visual Studio 2015 (32 bits or 64 bits) +-------------------------------------------------------------- +- Decompress current zlib, including all contrib/* files +- Open contrib\vstudio\vc14\zlibvc.sln with Microsoft Visual C++ 2015 + +Build instructions for Visual Studio 2022 (64 bits) +-------------------------------------------------------------- +- Decompress current zlib, including all contrib/* files +- Open contrib\vstudio\vc143\zlibvc.sln with Microsoft Visual C++ 2022 + + + +Important +--------- +- To use zlibwapi.dll in your application, you must define the + macro ZLIB_WINAPI when compiling your application's source files. + + +Additional notes +---------------- +- This DLL, named zlibwapi.dll, is compatible to the old zlib.dll built + by Gilles Vollant from the zlib 1.1.x sources, and distributed at + http://www.winimage.com/zLibDll + It uses the WINAPI calling convention for the exported functions, and + includes the minizip functionality. If your application needs that + particular build of zlib.dll, you can rename zlibwapi.dll to zlib.dll. + +- The new DLL was renamed because there exist several incompatible + versions of zlib.dll on the Internet. + +- There is also an official DLL build of zlib, named zlib1.dll. This one + is exporting the functions using the CDECL convention. See the file + win32\DLL_FAQ.txt found in this zlib distribution. + +- There used to be a ZLIB_DLL macro in zlib 1.1.x, but now this symbol + has a slightly different effect. To avoid compatibility problems, do + not define it here. + + +Gilles Vollant +info@winimage.com + +Visual Studio 2013, 2015, and 2022 Projects from Sean Hunt +seandhunt_7@yahoo.com diff --git a/zlib/contrib/vstudio/vc10/miniunz.vcxproj.filters b/zlib/contrib/vstudio/vc10/miniunz.vcxproj.filters index 0b2a3de2dfe2..e53556a63866 100644 --- a/zlib/contrib/vstudio/vc10/miniunz.vcxproj.filters +++ b/zlib/contrib/vstudio/vc10/miniunz.vcxproj.filters @@ -3,7 +3,7 @@ {048af943-022b-4db6-beeb-a54c34774ee2} - cpp;c;cxx;def;odl;idl;hpj;bat;asm + cpp;c;cxx;def;odl;idl;hpj;bat {c1d600d2-888f-4aea-b73e-8b0dd9befa0c} diff --git a/zlib/contrib/vstudio/vc10/minizip.vcxproj.filters b/zlib/contrib/vstudio/vc10/minizip.vcxproj.filters index dd73cd313298..bd18d715e7cd 100644 --- a/zlib/contrib/vstudio/vc10/minizip.vcxproj.filters +++ b/zlib/contrib/vstudio/vc10/minizip.vcxproj.filters @@ -3,7 +3,7 @@ {c0419b40-bf50-40da-b153-ff74215b79de} - cpp;c;cxx;def;odl;idl;hpj;bat;asm + cpp;c;cxx;def;odl;idl;hpj;bat {bb87b070-735b-478e-92ce-7383abb2f36c} diff --git a/zlib/contrib/vstudio/vc10/testzlib.vcxproj b/zlib/contrib/vstudio/vc10/testzlib.vcxproj index 9088d176f8ce..0e668f7643bd 100644 --- a/zlib/contrib/vstudio/vc10/testzlib.vcxproj +++ b/zlib/contrib/vstudio/vc10/testzlib.vcxproj @@ -181,7 +181,7 @@ Disabled ..\..\..;%(AdditionalIncludeDirectories) - ASMV;ASMINF;WIN32;ZLIB_WINAPI;_DEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + WIN32;ZLIB_WINAPI;_DEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) true Default MultiThreadedDebug @@ -194,7 +194,7 @@ EditAndContinue - ..\..\masmx86\match686.obj;..\..\masmx86\inffas32.obj;%(AdditionalDependencies) + %(AdditionalDependencies) $(OutDir)testzlib.exe true $(OutDir)testzlib.pdb @@ -241,7 +241,7 @@ OnlyExplicitInline true ..\..\..;%(AdditionalIncludeDirectories) - ASMV;ASMINF;WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) true Default MultiThreaded @@ -254,7 +254,7 @@ ProgramDatabase - ..\..\masmx86\match686.obj;..\..\masmx86\inffas32.obj;%(AdditionalDependencies) + %(AdditionalDependencies) $(OutDir)testzlib.exe true Console @@ -269,14 +269,14 @@ ..\..\..;%(AdditionalIncludeDirectories) - ASMV;ASMINF;WIN32;ZLIB_WINAPI;_DEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + WIN32;ZLIB_WINAPI;_DEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) Default MultiThreadedDebugDLL false $(IntDir) - ..\..\masmx64\gvmat64.obj;..\..\masmx64\inffasx64.obj;%(AdditionalDependencies) + %(AdditionalDependencies) @@ -352,14 +352,14 @@ ..\..\..;%(AdditionalIncludeDirectories) - ASMV;ASMINF;WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) Default MultiThreadedDLL false $(IntDir) - ..\..\masmx64\gvmat64.obj;..\..\masmx64\inffasx64.obj;%(AdditionalDependencies) + %(AdditionalDependencies) @@ -398,14 +398,6 @@ - - true - true - true - true - true - true - diff --git a/zlib/contrib/vstudio/vc10/testzlib.vcxproj.filters b/zlib/contrib/vstudio/vc10/testzlib.vcxproj.filters index 249daa89caf9..3cf52ee3edca 100644 --- a/zlib/contrib/vstudio/vc10/testzlib.vcxproj.filters +++ b/zlib/contrib/vstudio/vc10/testzlib.vcxproj.filters @@ -3,7 +3,7 @@ {c1f6a2e3-5da5-4955-8653-310d3efe05a9} - cpp;c;cxx;def;odl;idl;hpj;bat;asm + cpp;c;cxx;def;odl;idl;hpj;bat {c2aaffdc-2c95-4d6f-8466-4bec5890af2c} @@ -30,9 +30,6 @@ Source Files - - Source Files - Source Files diff --git a/zlib/contrib/vstudio/vc10/testzlibdll.vcxproj.filters b/zlib/contrib/vstudio/vc10/testzlibdll.vcxproj.filters index 53a8693bb0a4..aeb550e9c338 100644 --- a/zlib/contrib/vstudio/vc10/testzlibdll.vcxproj.filters +++ b/zlib/contrib/vstudio/vc10/testzlibdll.vcxproj.filters @@ -3,7 +3,7 @@ {fa61a89f-93fc-4c89-b29e-36224b7592f4} - cpp;c;cxx;def;odl;idl;hpj;bat;asm + cpp;c;cxx;def;odl;idl;hpj;bat {d4b85da0-2ba2-4934-b57f-e2584e3848ee} diff --git a/zlib/contrib/vstudio/vc10/zlib.rc b/zlib/contrib/vstudio/vc10/zlib.rc index fee177a71cb6..856bd11f08d8 100644 --- a/zlib/contrib/vstudio/vc10/zlib.rc +++ b/zlib/contrib/vstudio/vc10/zlib.rc @@ -2,8 +2,8 @@ #define IDR_VERSION1 1 IDR_VERSION1 VERSIONINFO MOVEABLE IMPURE LOADONCALL DISCARDABLE - FILEVERSION 1, 2, 11, 0 - PRODUCTVERSION 1, 2, 11, 0 + FILEVERSION 1, 3, 1, 0 + PRODUCTVERSION 1, 3, 1, 0 FILEFLAGSMASK VS_FFI_FILEFLAGSMASK FILEFLAGS 0 FILEOS VOS_DOS_WINDOWS32 @@ -17,12 +17,12 @@ BEGIN BEGIN VALUE "FileDescription", "zlib data compression and ZIP file I/O library\0" - VALUE "FileVersion", "1.2.11\0" + VALUE "FileVersion", "1.3.1\0" VALUE "InternalName", "zlib\0" VALUE "OriginalFilename", "zlibwapi.dll\0" VALUE "ProductName", "ZLib.DLL\0" VALUE "Comments","DLL support by Alessandro Iacopetti & Gilles Vollant\0" - VALUE "LegalCopyright", "(C) 1995-2017 Jean-loup Gailly & Mark Adler\0" + VALUE "LegalCopyright", "(C) 1995-2024 Jean-loup Gailly & Mark Adler\0" END END BLOCK "VarFileInfo" diff --git a/zlib/contrib/vstudio/vc10/zlibstat.vcxproj b/zlib/contrib/vstudio/vc10/zlibstat.vcxproj index b9f2bbe5f0b1..c7ed09e51956 100644 --- a/zlib/contrib/vstudio/vc10/zlibstat.vcxproj +++ b/zlib/contrib/vstudio/vc10/zlibstat.vcxproj @@ -160,7 +160,7 @@ Disabled - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) WIN32;ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) @@ -182,16 +182,12 @@ $(OutDir)zlibstat.lib true - - cd ..\..\masmx86 -bld_ml32.bat - OnlyExplicitInline - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) - WIN32;ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ASMV;ASMINF;%(PreprocessorDefinitions) + ..\..\..;%(AdditionalIncludeDirectories) + WIN32;ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) true @@ -210,19 +206,15 @@ bld_ml32.bat /MACHINE:X86 /NODEFAULTLIB %(AdditionalOptions) - ..\..\masmx86\match686.obj;..\..\masmx86\inffas32.obj;%(AdditionalDependencies) + %(AdditionalDependencies) $(OutDir)zlibstat.lib true - - cd ..\..\masmx86 -bld_ml32.bat - OnlyExplicitInline - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ..\..\..;%(AdditionalIncludeDirectories) WIN32;ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) true @@ -252,7 +244,7 @@ bld_ml32.bat Disabled - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ..\..\..;%(AdditionalIncludeDirectories) ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) @@ -274,10 +266,6 @@ bld_ml32.bat $(OutDir)zlibstat.lib true - - cd ..\..\masmx64 -bld_ml64.bat - @@ -285,7 +273,7 @@ bld_ml64.bat Disabled - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ..\..\..;%(AdditionalIncludeDirectories) ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) @@ -314,8 +302,8 @@ bld_ml64.bat OnlyExplicitInline - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) - ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ASMV;ASMINF;WIN64;%(PreprocessorDefinitions) + ..\..\..;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) true @@ -334,14 +322,10 @@ bld_ml64.bat /MACHINE:AMD64 /NODEFAULTLIB %(AdditionalOptions) - ..\..\masmx64\gvmat64.obj;..\..\masmx64\inffasx64.obj;%(AdditionalDependencies) + %(AdditionalDependencies) $(OutDir)zlibstat.lib true - - cd ..\..\masmx64 -bld_ml64.bat - @@ -349,7 +333,7 @@ bld_ml64.bat OnlyExplicitInline - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ..\..\..;%(AdditionalIncludeDirectories) ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) true @@ -379,7 +363,7 @@ bld_ml64.bat OnlyExplicitInline - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ..\..\..;%(AdditionalIncludeDirectories) ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) true @@ -409,7 +393,7 @@ bld_ml64.bat OnlyExplicitInline - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ..\..\..;%(AdditionalIncludeDirectories) ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) true @@ -443,14 +427,6 @@ bld_ml64.bat - - true - true - true - true - true - true - diff --git a/zlib/contrib/vstudio/vc10/zlibstat.vcxproj.filters b/zlib/contrib/vstudio/vc10/zlibstat.vcxproj.filters index c8c7f7ea395c..ba7e23d3253c 100644 --- a/zlib/contrib/vstudio/vc10/zlibstat.vcxproj.filters +++ b/zlib/contrib/vstudio/vc10/zlibstat.vcxproj.filters @@ -33,9 +33,6 @@ Source Files - - Source Files - Source Files diff --git a/zlib/contrib/vstudio/vc10/zlibvc.def b/zlib/contrib/vstudio/vc10/zlibvc.def index 54e683d99c35..3234a02d9537 100644 --- a/zlib/contrib/vstudio/vc10/zlibvc.def +++ b/zlib/contrib/vstudio/vc10/zlibvc.def @@ -1,7 +1,7 @@ LIBRARY ; zlib data compression and ZIP file I/O library -VERSION 1.2 +VERSION 1.3.1 EXPORTS adler32 @1 @@ -151,3 +151,8 @@ EXPORTS deflateGetDictionary @173 adler32_z @174 crc32_z @175 + +; zlib1 v1.2.12 added: + crc32_combine_gen @176 + crc32_combine_gen64 @177 + crc32_combine_op @178 diff --git a/zlib/contrib/vstudio/vc10/zlibvc.vcxproj b/zlib/contrib/vstudio/vc10/zlibvc.vcxproj index 6ff9ddb0772a..19dfc35bf318 100644 --- a/zlib/contrib/vstudio/vc10/zlibvc.vcxproj +++ b/zlib/contrib/vstudio/vc10/zlibvc.vcxproj @@ -197,8 +197,8 @@ Disabled - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) - WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;ASMV;ASMINF;%(PreprocessorDefinitions) + ..\..\..;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;%(PreprocessorDefinitions) MultiThreadedDebug @@ -219,7 +219,7 @@ /MACHINE:I386 %(AdditionalOptions) - ..\..\masmx86\match686.obj;..\..\masmx86\inffas32.obj;%(AdditionalDependencies) + %(AdditionalDependencies) true .\zlibvc.def true @@ -229,10 +229,6 @@ - - cd ..\..\masmx86 -bld_ml32.bat - @@ -244,7 +240,7 @@ bld_ml32.bat OnlyExplicitInline - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ..\..\..;%(AdditionalIncludeDirectories) WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;%(PreprocessorDefinitions) true @@ -288,8 +284,8 @@ bld_ml32.bat OnlyExplicitInline - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) - WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;ASMV;ASMINF;%(PreprocessorDefinitions) + ..\..\..;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;%(PreprocessorDefinitions) true @@ -312,7 +308,7 @@ bld_ml32.bat /MACHINE:I386 %(AdditionalOptions) - ..\..\masmx86\match686.obj;..\..\masmx86\inffas32.obj;%(AdditionalDependencies) + %(AdditionalDependencies) true false .\zlibvc.def @@ -322,10 +318,6 @@ bld_ml32.bat - - cd ..\..\masmx86 -bld_ml32.bat - @@ -337,8 +329,8 @@ bld_ml32.bat Disabled - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) - WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;ASMV;ASMINF;WIN64;%(PreprocessorDefinitions) + ..\..\..;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions) MultiThreadedDebugDLL @@ -358,7 +350,7 @@ bld_ml32.bat 0x040c - ..\..\masmx64\gvmat64.obj;..\..\masmx64\inffasx64.obj;%(AdditionalDependencies) + %(AdditionalDependencies) true .\zlibvc.def true @@ -366,10 +358,6 @@ bld_ml32.bat Windows MachineX64 - - cd ..\..\masmx64 -bld_ml64.bat - @@ -381,7 +369,7 @@ bld_ml64.bat Disabled - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ..\..\..;%(AdditionalIncludeDirectories) WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions) @@ -424,7 +412,7 @@ bld_ml64.bat OnlyExplicitInline - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ..\..\..;%(AdditionalIncludeDirectories) WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions) true @@ -465,7 +453,7 @@ bld_ml64.bat OnlyExplicitInline - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ..\..\..;%(AdditionalIncludeDirectories) WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions) true @@ -510,8 +498,8 @@ bld_ml64.bat OnlyExplicitInline - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) - _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;ASMV;ASMINF;WIN64;%(PreprocessorDefinitions) + ..\..\..;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions) true @@ -533,7 +521,7 @@ bld_ml64.bat 0x040c - ..\..\masmx64\gvmat64.obj;..\..\masmx64\inffasx64.obj;%(AdditionalDependencies) + %(AdditionalDependencies) true false .\zlibvc.def @@ -541,10 +529,6 @@ bld_ml64.bat Windows MachineX64 - - cd ..\..\masmx64 -bld_ml64.bat - @@ -556,7 +540,7 @@ bld_ml64.bat OnlyExplicitInline - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ..\..\..;%(AdditionalIncludeDirectories) _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions) true @@ -601,14 +585,6 @@ bld_ml64.bat - - true - true - true - true - true - true - diff --git a/zlib/contrib/vstudio/vc10/zlibvc.vcxproj.filters b/zlib/contrib/vstudio/vc10/zlibvc.vcxproj.filters index 180b71cd61df..67c444ab9ab1 100644 --- a/zlib/contrib/vstudio/vc10/zlibvc.vcxproj.filters +++ b/zlib/contrib/vstudio/vc10/zlibvc.vcxproj.filters @@ -42,9 +42,6 @@ Source Files - - Source Files - Source Files diff --git a/zlib/contrib/vstudio/vc11/testzlib.vcxproj b/zlib/contrib/vstudio/vc11/testzlib.vcxproj index 6d5595401306..c6198c1fd292 100644 --- a/zlib/contrib/vstudio/vc11/testzlib.vcxproj +++ b/zlib/contrib/vstudio/vc11/testzlib.vcxproj @@ -187,7 +187,7 @@ Disabled ..\..\..;%(AdditionalIncludeDirectories) - ASMV;ASMINF;WIN32;ZLIB_WINAPI;_DEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + WIN32;ZLIB_WINAPI;_DEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) true Default MultiThreadedDebugDLL @@ -200,7 +200,7 @@ ProgramDatabase - ..\..\masmx86\match686.obj;..\..\masmx86\inffas32.obj;%(AdditionalDependencies) + %(AdditionalDependencies) $(OutDir)testzlib.exe true $(OutDir)testzlib.pdb @@ -247,7 +247,7 @@ OnlyExplicitInline true ..\..\..;%(AdditionalIncludeDirectories) - ASMV;ASMINF;WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) true Default MultiThreaded @@ -260,7 +260,7 @@ ProgramDatabase - ..\..\masmx86\match686.obj;..\..\masmx86\inffas32.obj;%(AdditionalDependencies) + %(AdditionalDependencies) $(OutDir)testzlib.exe true Console @@ -275,14 +275,14 @@ ..\..\..;%(AdditionalIncludeDirectories) - ASMV;ASMINF;WIN32;ZLIB_WINAPI;_DEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + WIN32;ZLIB_WINAPI;_DEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) Default MultiThreadedDebugDLL false $(IntDir) - ..\..\masmx64\gvmat64.obj;..\..\masmx64\inffasx64.obj;%(AdditionalDependencies) + %(AdditionalDependencies) @@ -358,14 +358,14 @@ ..\..\..;%(AdditionalIncludeDirectories) - ASMV;ASMINF;WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) Default MultiThreadedDLL false $(IntDir) - ..\..\masmx64\gvmat64.obj;..\..\masmx64\inffasx64.obj;%(AdditionalDependencies) + %(AdditionalDependencies) @@ -404,14 +404,6 @@ - - true - true - true - true - true - true - diff --git a/zlib/contrib/vstudio/vc11/zlib.rc b/zlib/contrib/vstudio/vc11/zlib.rc index fee177a71cb6..856bd11f08d8 100644 --- a/zlib/contrib/vstudio/vc11/zlib.rc +++ b/zlib/contrib/vstudio/vc11/zlib.rc @@ -2,8 +2,8 @@ #define IDR_VERSION1 1 IDR_VERSION1 VERSIONINFO MOVEABLE IMPURE LOADONCALL DISCARDABLE - FILEVERSION 1, 2, 11, 0 - PRODUCTVERSION 1, 2, 11, 0 + FILEVERSION 1, 3, 1, 0 + PRODUCTVERSION 1, 3, 1, 0 FILEFLAGSMASK VS_FFI_FILEFLAGSMASK FILEFLAGS 0 FILEOS VOS_DOS_WINDOWS32 @@ -17,12 +17,12 @@ BEGIN BEGIN VALUE "FileDescription", "zlib data compression and ZIP file I/O library\0" - VALUE "FileVersion", "1.2.11\0" + VALUE "FileVersion", "1.3.1\0" VALUE "InternalName", "zlib\0" VALUE "OriginalFilename", "zlibwapi.dll\0" VALUE "ProductName", "ZLib.DLL\0" VALUE "Comments","DLL support by Alessandro Iacopetti & Gilles Vollant\0" - VALUE "LegalCopyright", "(C) 1995-2017 Jean-loup Gailly & Mark Adler\0" + VALUE "LegalCopyright", "(C) 1995-2024 Jean-loup Gailly & Mark Adler\0" END END BLOCK "VarFileInfo" diff --git a/zlib/contrib/vstudio/vc11/zlibstat.vcxproj b/zlib/contrib/vstudio/vc11/zlibstat.vcxproj index 806b76a88b63..86fb1c8bf605 100644 --- a/zlib/contrib/vstudio/vc11/zlibstat.vcxproj +++ b/zlib/contrib/vstudio/vc11/zlibstat.vcxproj @@ -167,7 +167,7 @@ Disabled - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ..\..\..;%(AdditionalIncludeDirectories) WIN32;ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) @@ -193,8 +193,8 @@ OnlyExplicitInline - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) - WIN32;ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ASMV;ASMINF;%(PreprocessorDefinitions) + ..\..\..;%(AdditionalIncludeDirectories) + WIN32;ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) true @@ -213,7 +213,7 @@ /MACHINE:X86 /NODEFAULTLIB %(AdditionalOptions) - ..\..\masmx86\match686.obj;..\..\masmx86\inffas32.obj;%(AdditionalDependencies) + %(AdditionalDependencies) $(OutDir)zlibstat.lib true @@ -221,7 +221,7 @@ OnlyExplicitInline - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ..\..\..;%(AdditionalIncludeDirectories) WIN32;ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) true @@ -251,7 +251,7 @@ Disabled - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ..\..\..;%(AdditionalIncludeDirectories) ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) @@ -280,7 +280,7 @@ Disabled - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ..\..\..;%(AdditionalIncludeDirectories) ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) @@ -309,8 +309,8 @@ OnlyExplicitInline - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) - ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ASMV;ASMINF;WIN64;%(PreprocessorDefinitions) + ..\..\..;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) true @@ -329,7 +329,7 @@ /MACHINE:AMD64 /NODEFAULTLIB %(AdditionalOptions) - ..\..\masmx64\gvmat64.obj;..\..\masmx64\inffasx64.obj;%(AdditionalDependencies) + %(AdditionalDependencies) $(OutDir)zlibstat.lib true @@ -340,7 +340,7 @@ OnlyExplicitInline - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ..\..\..;%(AdditionalIncludeDirectories) ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) true @@ -370,7 +370,7 @@ OnlyExplicitInline - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ..\..\..;%(AdditionalIncludeDirectories) ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) true @@ -400,7 +400,7 @@ OnlyExplicitInline - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ..\..\..;%(AdditionalIncludeDirectories) ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) true @@ -434,14 +434,6 @@ - - true - true - true - true - true - true - diff --git a/zlib/contrib/vstudio/vc11/zlibvc.def b/zlib/contrib/vstudio/vc11/zlibvc.def index 54e683d99c35..3234a02d9537 100644 --- a/zlib/contrib/vstudio/vc11/zlibvc.def +++ b/zlib/contrib/vstudio/vc11/zlibvc.def @@ -1,7 +1,7 @@ LIBRARY ; zlib data compression and ZIP file I/O library -VERSION 1.2 +VERSION 1.3.1 EXPORTS adler32 @1 @@ -151,3 +151,8 @@ EXPORTS deflateGetDictionary @173 adler32_z @174 crc32_z @175 + +; zlib1 v1.2.12 added: + crc32_combine_gen @176 + crc32_combine_gen64 @177 + crc32_combine_op @178 diff --git a/zlib/contrib/vstudio/vc11/zlibvc.vcxproj b/zlib/contrib/vstudio/vc11/zlibvc.vcxproj index c65b95fdbb5c..fc8cd9c1765f 100644 --- a/zlib/contrib/vstudio/vc11/zlibvc.vcxproj +++ b/zlib/contrib/vstudio/vc11/zlibvc.vcxproj @@ -204,8 +204,8 @@ Disabled - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) - WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;ASMV;ASMINF;%(PreprocessorDefinitions) + ..\..\..;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;%(PreprocessorDefinitions) MultiThreadedDebugDLL @@ -226,7 +226,7 @@ /MACHINE:I386 %(AdditionalOptions) - ..\..\masmx86\match686.obj;..\..\masmx86\inffas32.obj;%(AdditionalDependencies) + %(AdditionalDependencies) $(OutDir)zlibwapi.dll true .\zlibvc.def @@ -240,10 +240,6 @@ $(OutDir)zlibwapi.lib - - cd ..\..\masmx86 -bld_ml32.bat - @@ -255,7 +251,7 @@ bld_ml32.bat OnlyExplicitInline - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ..\..\..;%(AdditionalIncludeDirectories) WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;%(PreprocessorDefinitions) true @@ -303,8 +299,8 @@ bld_ml32.bat OnlyExplicitInline - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) - WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;ASMV;ASMINF;%(PreprocessorDefinitions) + ..\..\..;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;%(PreprocessorDefinitions) true @@ -327,7 +323,7 @@ bld_ml32.bat /MACHINE:I386 %(AdditionalOptions) - ..\..\masmx86\match686.obj;..\..\masmx86\inffas32.obj;%(AdditionalDependencies) + %(AdditionalDependencies) $(OutDir)zlibwapi.dll true false @@ -341,10 +337,6 @@ bld_ml32.bat $(OutDir)zlibwapi.lib - - cd ..\..\masmx86 -bld_ml32.bat - @@ -356,8 +348,8 @@ bld_ml32.bat Disabled - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) - WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;ASMV;ASMINF;WIN64;%(PreprocessorDefinitions) + ..\..\..;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions) MultiThreadedDebugDLL @@ -377,7 +369,7 @@ bld_ml32.bat 0x040c - ..\..\masmx64\gvmat64.obj;..\..\masmx64\inffasx64.obj;%(AdditionalDependencies) + %(AdditionalDependencies) $(OutDir)zlibwapi.dll true .\zlibvc.def @@ -389,10 +381,6 @@ bld_ml32.bat $(OutDir)zlibwapi.lib MachineX64 - - cd ..\..\contrib\masmx64 -bld_ml64.bat - @@ -404,7 +392,7 @@ bld_ml64.bat Disabled - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ..\..\..;%(AdditionalIncludeDirectories) WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions) @@ -447,7 +435,7 @@ bld_ml64.bat OnlyExplicitInline - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ..\..\..;%(AdditionalIncludeDirectories) WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions) true @@ -492,7 +480,7 @@ bld_ml64.bat OnlyExplicitInline - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ..\..\..;%(AdditionalIncludeDirectories) WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions) true @@ -537,8 +525,8 @@ bld_ml64.bat OnlyExplicitInline - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) - _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;ASMV;ASMINF;WIN64;%(PreprocessorDefinitions) + ..\..\..;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions) true @@ -560,7 +548,7 @@ bld_ml64.bat 0x040c - ..\..\masmx64\gvmat64.obj;..\..\masmx64\inffasx64.obj;%(AdditionalDependencies) + %(AdditionalDependencies) $(OutDir)zlibwapi.dll true false @@ -572,10 +560,6 @@ bld_ml64.bat $(OutDir)zlibwapi.lib MachineX64 - - cd ..\..\masmx64 -bld_ml64.bat - @@ -587,7 +571,7 @@ bld_ml64.bat OnlyExplicitInline - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ..\..\..;%(AdditionalIncludeDirectories) _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions) true @@ -632,14 +616,6 @@ bld_ml64.bat - - true - true - true - true - true - true - diff --git a/zlib/contrib/vstudio/vc12/testzlib.vcxproj b/zlib/contrib/vstudio/vc12/testzlib.vcxproj index 64b2cbe34a23..41303c0af488 100644 --- a/zlib/contrib/vstudio/vc12/testzlib.vcxproj +++ b/zlib/contrib/vstudio/vc12/testzlib.vcxproj @@ -190,7 +190,7 @@ Disabled ..\..\..;%(AdditionalIncludeDirectories) - ASMV;ASMINF;WIN32;ZLIB_WINAPI;_DEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + WIN32;ZLIB_WINAPI;_DEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) true Default MultiThreadedDebugDLL @@ -203,7 +203,7 @@ ProgramDatabase - ..\..\masmx86\match686.obj;..\..\masmx86\inffas32.obj;%(AdditionalDependencies) + %(AdditionalDependencies) $(OutDir)testzlib.exe true $(OutDir)testzlib.pdb @@ -250,7 +250,7 @@ OnlyExplicitInline true ..\..\..;%(AdditionalIncludeDirectories) - ASMV;ASMINF;WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) true Default MultiThreaded @@ -263,7 +263,7 @@ ProgramDatabase - ..\..\masmx86\match686.obj;..\..\masmx86\inffas32.obj;%(AdditionalDependencies) + %(AdditionalDependencies) $(OutDir)testzlib.exe true Console @@ -279,14 +279,14 @@ ..\..\..;%(AdditionalIncludeDirectories) - ASMV;ASMINF;WIN32;ZLIB_WINAPI;_DEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + WIN32;ZLIB_WINAPI;_DEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) Default MultiThreadedDebugDLL false $(IntDir) - ..\..\masmx64\gvmat64.obj;..\..\masmx64\inffasx64.obj;%(AdditionalDependencies) + %(AdditionalDependencies) @@ -362,14 +362,14 @@ ..\..\..;%(AdditionalIncludeDirectories) - ASMV;ASMINF;WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) Default MultiThreadedDLL false $(IntDir) - ..\..\masmx64\gvmat64.obj;..\..\masmx64\inffasx64.obj;%(AdditionalDependencies) + %(AdditionalDependencies) @@ -408,14 +408,6 @@ - - true - true - true - true - true - true - diff --git a/zlib/contrib/vstudio/vc12/zlib.rc b/zlib/contrib/vstudio/vc12/zlib.rc index c4e4b016e9c8..a55f341c74c1 100644 --- a/zlib/contrib/vstudio/vc12/zlib.rc +++ b/zlib/contrib/vstudio/vc12/zlib.rc @@ -2,8 +2,8 @@ #define IDR_VERSION1 1 IDR_VERSION1 VERSIONINFO MOVEABLE IMPURE LOADONCALL DISCARDABLE - FILEVERSION 1, 2, 11, 0 - PRODUCTVERSION 1, 2, 11, 0 + FILEVERSION 1, 3, 1, 0 + PRODUCTVERSION 1, 3, 1, 0 FILEFLAGSMASK VS_FFI_FILEFLAGSMASK FILEFLAGS 0 FILEOS VOS_DOS_WINDOWS32 @@ -17,12 +17,12 @@ BEGIN BEGIN VALUE "FileDescription", "zlib data compression and ZIP file I/O library\0" - VALUE "FileVersion", "1.2.11\0" + VALUE "FileVersion", "1.3.1\0" VALUE "InternalName", "zlib\0" VALUE "OriginalFilename", "zlibwapi.dll\0" VALUE "ProductName", "ZLib.DLL\0" VALUE "Comments","DLL support by Alessandro Iacopetti & Gilles Vollant\0" - VALUE "LegalCopyright", "(C) 1995-2017 Jean-loup Gailly & Mark Adler\0" + VALUE "LegalCopyright", "(C) 1995-2024 Jean-loup Gailly & Mark Adler\0" END END BLOCK "VarFileInfo" diff --git a/zlib/contrib/vstudio/vc12/zlibstat.vcxproj b/zlib/contrib/vstudio/vc12/zlibstat.vcxproj index 3fdee7c50782..6629d8e2a3a9 100644 --- a/zlib/contrib/vstudio/vc12/zlibstat.vcxproj +++ b/zlib/contrib/vstudio/vc12/zlibstat.vcxproj @@ -170,7 +170,7 @@ Disabled - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ..\..\..;%(AdditionalIncludeDirectories) WIN32;ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) @@ -196,8 +196,8 @@ OnlyExplicitInline - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) - WIN32;ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ASMV;ASMINF;%(PreprocessorDefinitions) + ..\..\..;%(AdditionalIncludeDirectories) + WIN32;ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) true @@ -216,7 +216,7 @@ /MACHINE:X86 /NODEFAULTLIB %(AdditionalOptions) - ..\..\masmx86\match686.obj;..\..\masmx86\inffas32.obj;%(AdditionalDependencies) + %(AdditionalDependencies) $(OutDir)zlibstat.lib true @@ -224,7 +224,7 @@ OnlyExplicitInline - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ..\..\..;%(AdditionalIncludeDirectories) WIN32;ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) true @@ -254,7 +254,7 @@ Disabled - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ..\..\..;%(AdditionalIncludeDirectories) ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) @@ -283,7 +283,7 @@ Disabled - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ..\..\..;%(AdditionalIncludeDirectories) ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) @@ -312,8 +312,8 @@ OnlyExplicitInline - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) - ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ASMV;ASMINF;WIN64;%(PreprocessorDefinitions) + ..\..\..;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) true @@ -332,7 +332,7 @@ /MACHINE:AMD64 /NODEFAULTLIB %(AdditionalOptions) - ..\..\masmx64\gvmat64.obj;..\..\masmx64\inffasx64.obj;%(AdditionalDependencies) + %(AdditionalDependencies) $(OutDir)zlibstat.lib true @@ -343,7 +343,7 @@ OnlyExplicitInline - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ..\..\..;%(AdditionalIncludeDirectories) ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) true @@ -373,7 +373,7 @@ OnlyExplicitInline - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ..\..\..;%(AdditionalIncludeDirectories) ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) true @@ -403,7 +403,7 @@ OnlyExplicitInline - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ..\..\..;%(AdditionalIncludeDirectories) ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) true @@ -437,14 +437,6 @@ - - true - true - true - true - true - true - diff --git a/zlib/contrib/vstudio/vc12/zlibvc.def b/zlib/contrib/vstudio/vc12/zlibvc.def index 54e683d99c35..3234a02d9537 100644 --- a/zlib/contrib/vstudio/vc12/zlibvc.def +++ b/zlib/contrib/vstudio/vc12/zlibvc.def @@ -1,7 +1,7 @@ LIBRARY ; zlib data compression and ZIP file I/O library -VERSION 1.2 +VERSION 1.3.1 EXPORTS adler32 @1 @@ -151,3 +151,8 @@ EXPORTS deflateGetDictionary @173 adler32_z @174 crc32_z @175 + +; zlib1 v1.2.12 added: + crc32_combine_gen @176 + crc32_combine_gen64 @177 + crc32_combine_op @178 diff --git a/zlib/contrib/vstudio/vc12/zlibvc.vcxproj b/zlib/contrib/vstudio/vc12/zlibvc.vcxproj index ab2b6c360355..4e0de691ef31 100644 --- a/zlib/contrib/vstudio/vc12/zlibvc.vcxproj +++ b/zlib/contrib/vstudio/vc12/zlibvc.vcxproj @@ -207,8 +207,8 @@ Disabled - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) - WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;ASMV;ASMINF;%(PreprocessorDefinitions) + ..\..\..;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;%(PreprocessorDefinitions) MultiThreadedDebugDLL @@ -229,7 +229,7 @@ /MACHINE:I386 %(AdditionalOptions) - ..\..\masmx86\match686.obj;..\..\masmx86\inffas32.obj;%(AdditionalDependencies) + %(AdditionalDependencies) $(OutDir)zlibwapi.dll true .\zlibvc.def @@ -243,10 +243,6 @@ $(OutDir)zlibwapi.lib - - cd ..\..\masmx86 -bld_ml32.bat - @@ -258,7 +254,7 @@ bld_ml32.bat OnlyExplicitInline - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ..\..\..;%(AdditionalIncludeDirectories) WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;%(PreprocessorDefinitions) true @@ -306,8 +302,8 @@ bld_ml32.bat OnlyExplicitInline - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) - WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;ASMV;ASMINF;%(PreprocessorDefinitions) + ..\..\..;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;%(PreprocessorDefinitions) true @@ -330,7 +326,7 @@ bld_ml32.bat /MACHINE:I386 %(AdditionalOptions) - ..\..\masmx86\match686.obj;..\..\masmx86\inffas32.obj;%(AdditionalDependencies) + %(AdditionalDependencies) $(OutDir)zlibwapi.dll true false @@ -345,10 +341,6 @@ bld_ml32.bat $(OutDir)zlibwapi.lib false - - cd ..\..\masmx86 -bld_ml32.bat - @@ -360,8 +352,8 @@ bld_ml32.bat Disabled - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) - WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;ASMV;ASMINF;WIN64;%(PreprocessorDefinitions) + ..\..\..;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions) MultiThreadedDebugDLL @@ -381,7 +373,7 @@ bld_ml32.bat 0x040c - ..\..\masmx64\gvmat64.obj;..\..\masmx64\inffasx64.obj;%(AdditionalDependencies) + %(AdditionalDependencies) $(OutDir)zlibwapi.dll true .\zlibvc.def @@ -393,10 +385,6 @@ bld_ml32.bat $(OutDir)zlibwapi.lib MachineX64 - - cd ..\..\contrib\masmx64 -bld_ml64.bat - @@ -408,7 +396,7 @@ bld_ml64.bat Disabled - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ..\..\..;%(AdditionalIncludeDirectories) WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions) @@ -451,7 +439,7 @@ bld_ml64.bat OnlyExplicitInline - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ..\..\..;%(AdditionalIncludeDirectories) WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions) true @@ -496,7 +484,7 @@ bld_ml64.bat OnlyExplicitInline - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ..\..\..;%(AdditionalIncludeDirectories) WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions) true @@ -541,8 +529,8 @@ bld_ml64.bat OnlyExplicitInline - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) - _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;ASMV;ASMINF;WIN64;%(PreprocessorDefinitions) + ..\..\..;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions) true @@ -564,7 +552,7 @@ bld_ml64.bat 0x040c - ..\..\masmx64\gvmat64.obj;..\..\masmx64\inffasx64.obj;%(AdditionalDependencies) + %(AdditionalDependencies) $(OutDir)zlibwapi.dll true false @@ -576,10 +564,6 @@ bld_ml64.bat $(OutDir)zlibwapi.lib MachineX64 - - cd ..\..\masmx64 -bld_ml64.bat - @@ -591,7 +575,7 @@ bld_ml64.bat OnlyExplicitInline - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ..\..\..;%(AdditionalIncludeDirectories) _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions) true @@ -636,14 +620,6 @@ bld_ml64.bat - - true - true - true - true - true - true - diff --git a/zlib/contrib/vstudio/vc14/testzlib.vcxproj b/zlib/contrib/vstudio/vc14/testzlib.vcxproj index 2c371252aeb7..545204954dd4 100644 --- a/zlib/contrib/vstudio/vc14/testzlib.vcxproj +++ b/zlib/contrib/vstudio/vc14/testzlib.vcxproj @@ -190,7 +190,7 @@ Disabled ..\..\..;%(AdditionalIncludeDirectories) - ASMV;ASMINF;WIN32;ZLIB_WINAPI;_DEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + WIN32;ZLIB_WINAPI;_DEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) true Default MultiThreadedDebugDLL @@ -203,7 +203,7 @@ ProgramDatabase - ..\..\masmx86\match686.obj;..\..\masmx86\inffas32.obj;%(AdditionalDependencies) + %(AdditionalDependencies) $(OutDir)testzlib.exe true $(OutDir)testzlib.pdb @@ -250,7 +250,7 @@ OnlyExplicitInline true ..\..\..;%(AdditionalIncludeDirectories) - ASMV;ASMINF;WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) true Default MultiThreaded @@ -263,7 +263,7 @@ ProgramDatabase - ..\..\masmx86\match686.obj;..\..\masmx86\inffas32.obj;%(AdditionalDependencies) + %(AdditionalDependencies) $(OutDir)testzlib.exe true Console @@ -279,14 +279,14 @@ ..\..\..;%(AdditionalIncludeDirectories) - ASMV;ASMINF;WIN32;ZLIB_WINAPI;_DEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + WIN32;ZLIB_WINAPI;_DEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) Default MultiThreadedDebugDLL false $(IntDir) - ..\..\masmx64\gvmat64.obj;..\..\masmx64\inffasx64.obj;%(AdditionalDependencies) + %(AdditionalDependencies) @@ -362,14 +362,14 @@ ..\..\..;%(AdditionalIncludeDirectories) - ASMV;ASMINF;WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) Default MultiThreadedDLL false $(IntDir) - ..\..\masmx64\gvmat64.obj;..\..\masmx64\inffasx64.obj;%(AdditionalDependencies) + %(AdditionalDependencies) @@ -408,14 +408,6 @@ - - true - true - true - true - true - true - diff --git a/zlib/contrib/vstudio/vc14/zlib.rc b/zlib/contrib/vstudio/vc14/zlib.rc index c4e4b016e9c8..a55f341c74c1 100644 --- a/zlib/contrib/vstudio/vc14/zlib.rc +++ b/zlib/contrib/vstudio/vc14/zlib.rc @@ -2,8 +2,8 @@ #define IDR_VERSION1 1 IDR_VERSION1 VERSIONINFO MOVEABLE IMPURE LOADONCALL DISCARDABLE - FILEVERSION 1, 2, 11, 0 - PRODUCTVERSION 1, 2, 11, 0 + FILEVERSION 1, 3, 1, 0 + PRODUCTVERSION 1, 3, 1, 0 FILEFLAGSMASK VS_FFI_FILEFLAGSMASK FILEFLAGS 0 FILEOS VOS_DOS_WINDOWS32 @@ -17,12 +17,12 @@ BEGIN BEGIN VALUE "FileDescription", "zlib data compression and ZIP file I/O library\0" - VALUE "FileVersion", "1.2.11\0" + VALUE "FileVersion", "1.3.1\0" VALUE "InternalName", "zlib\0" VALUE "OriginalFilename", "zlibwapi.dll\0" VALUE "ProductName", "ZLib.DLL\0" VALUE "Comments","DLL support by Alessandro Iacopetti & Gilles Vollant\0" - VALUE "LegalCopyright", "(C) 1995-2017 Jean-loup Gailly & Mark Adler\0" + VALUE "LegalCopyright", "(C) 1995-2024 Jean-loup Gailly & Mark Adler\0" END END BLOCK "VarFileInfo" diff --git a/zlib/contrib/vstudio/vc14/zlibstat.vcxproj b/zlib/contrib/vstudio/vc14/zlibstat.vcxproj index 3e4b986392ec..85c1e8958e67 100644 --- a/zlib/contrib/vstudio/vc14/zlibstat.vcxproj +++ b/zlib/contrib/vstudio/vc14/zlibstat.vcxproj @@ -170,7 +170,7 @@ Disabled - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ..\..\..;%(AdditionalIncludeDirectories) WIN32;ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) @@ -196,8 +196,8 @@ OnlyExplicitInline - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) - WIN32;ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ASMV;ASMINF;%(PreprocessorDefinitions) + ..\..\..;%(AdditionalIncludeDirectories) + WIN32;ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) true @@ -216,7 +216,7 @@ /MACHINE:X86 /NODEFAULTLIB %(AdditionalOptions) - ..\..\masmx86\match686.obj;..\..\masmx86\inffas32.obj;%(AdditionalDependencies) + %(AdditionalDependencies) $(OutDir)zlibstat.lib true @@ -224,7 +224,7 @@ OnlyExplicitInline - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ..\..\..;%(AdditionalIncludeDirectories) WIN32;ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) true @@ -254,7 +254,7 @@ Disabled - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ..\..\..;%(AdditionalIncludeDirectories) ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) @@ -283,7 +283,7 @@ Disabled - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ..\..\..;%(AdditionalIncludeDirectories) ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) @@ -312,8 +312,8 @@ OnlyExplicitInline - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) - ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ASMV;ASMINF;WIN64;%(PreprocessorDefinitions) + ..\..\..;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) true @@ -332,7 +332,7 @@ /MACHINE:AMD64 /NODEFAULTLIB %(AdditionalOptions) - ..\..\masmx64\gvmat64.obj;..\..\masmx64\inffasx64.obj;%(AdditionalDependencies) + %(AdditionalDependencies) $(OutDir)zlibstat.lib true @@ -343,7 +343,7 @@ OnlyExplicitInline - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ..\..\..;%(AdditionalIncludeDirectories) ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) true @@ -373,7 +373,7 @@ OnlyExplicitInline - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ..\..\..;%(AdditionalIncludeDirectories) ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) true @@ -403,7 +403,7 @@ OnlyExplicitInline - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ..\..\..;%(AdditionalIncludeDirectories) ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) true @@ -437,14 +437,6 @@ - - true - true - true - true - true - true - diff --git a/zlib/contrib/vstudio/vc14/zlibvc.def b/zlib/contrib/vstudio/vc14/zlibvc.def index 54e683d99c35..3234a02d9537 100644 --- a/zlib/contrib/vstudio/vc14/zlibvc.def +++ b/zlib/contrib/vstudio/vc14/zlibvc.def @@ -1,7 +1,7 @@ LIBRARY ; zlib data compression and ZIP file I/O library -VERSION 1.2 +VERSION 1.3.1 EXPORTS adler32 @1 @@ -151,3 +151,8 @@ EXPORTS deflateGetDictionary @173 adler32_z @174 crc32_z @175 + +; zlib1 v1.2.12 added: + crc32_combine_gen @176 + crc32_combine_gen64 @177 + crc32_combine_op @178 diff --git a/zlib/contrib/vstudio/vc14/zlibvc.vcxproj b/zlib/contrib/vstudio/vc14/zlibvc.vcxproj index f8f673cb0569..424ff55b7eda 100644 --- a/zlib/contrib/vstudio/vc14/zlibvc.vcxproj +++ b/zlib/contrib/vstudio/vc14/zlibvc.vcxproj @@ -207,8 +207,8 @@ Disabled - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) - WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;ASMV;ASMINF;%(PreprocessorDefinitions) + ..\..\..;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;%(PreprocessorDefinitions) MultiThreadedDebugDLL @@ -229,7 +229,7 @@ /MACHINE:I386 %(AdditionalOptions) - ..\..\masmx86\match686.obj;..\..\masmx86\inffas32.obj;%(AdditionalDependencies) + %(AdditionalDependencies) $(OutDir)zlibwapi.dll true .\zlibvc.def @@ -243,10 +243,6 @@ $(OutDir)zlibwapi.lib - - cd ..\..\masmx86 -bld_ml32.bat - @@ -258,7 +254,7 @@ bld_ml32.bat OnlyExplicitInline - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ..\..\..;%(AdditionalIncludeDirectories) WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;%(PreprocessorDefinitions) true @@ -306,8 +302,8 @@ bld_ml32.bat OnlyExplicitInline - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) - WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;ASMV;ASMINF;%(PreprocessorDefinitions) + ..\..\..;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;%(PreprocessorDefinitions) true @@ -330,7 +326,7 @@ bld_ml32.bat /MACHINE:I386 %(AdditionalOptions) - ..\..\masmx86\match686.obj;..\..\masmx86\inffas32.obj;%(AdditionalDependencies) + %(AdditionalDependencies) $(OutDir)zlibwapi.dll true false @@ -345,10 +341,6 @@ bld_ml32.bat $(OutDir)zlibwapi.lib false - - cd ..\..\masmx86 -bld_ml32.bat - @@ -360,8 +352,8 @@ bld_ml32.bat Disabled - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) - WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;ASMV;ASMINF;WIN64;%(PreprocessorDefinitions) + ..\..\..;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions) MultiThreadedDebugDLL @@ -381,7 +373,7 @@ bld_ml32.bat 0x040c - ..\..\masmx64\gvmat64.obj;..\..\masmx64\inffasx64.obj;%(AdditionalDependencies) + %(AdditionalDependencies) $(OutDir)zlibwapi.dll true .\zlibvc.def @@ -393,10 +385,6 @@ bld_ml32.bat $(OutDir)zlibwapi.lib MachineX64 - - cd ..\..\contrib\masmx64 -bld_ml64.bat - @@ -408,7 +396,7 @@ bld_ml64.bat Disabled - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ..\..\..;%(AdditionalIncludeDirectories) WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions) @@ -451,7 +439,7 @@ bld_ml64.bat OnlyExplicitInline - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ..\..\..;%(AdditionalIncludeDirectories) WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions) true @@ -496,7 +484,7 @@ bld_ml64.bat OnlyExplicitInline - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ..\..\..;%(AdditionalIncludeDirectories) WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions) true @@ -541,8 +529,8 @@ bld_ml64.bat OnlyExplicitInline - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) - _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;ASMV;ASMINF;WIN64;%(PreprocessorDefinitions) + ..\..\..;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions) true @@ -564,7 +552,7 @@ bld_ml64.bat 0x040c - ..\..\masmx64\gvmat64.obj;..\..\masmx64\inffasx64.obj;%(AdditionalDependencies) + %(AdditionalDependencies) $(OutDir)zlibwapi.dll true false @@ -576,10 +564,6 @@ bld_ml64.bat $(OutDir)zlibwapi.lib MachineX64 - - cd ..\..\masmx64 -bld_ml64.bat - @@ -591,7 +575,7 @@ bld_ml64.bat OnlyExplicitInline - ..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories) + ..\..\..;%(AdditionalIncludeDirectories) _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions) true @@ -636,14 +620,6 @@ bld_ml64.bat - - true - true - true - true - true - true - diff --git a/zlib/contrib/vstudio/vc17/miniunz.vcxproj b/zlib/contrib/vstudio/vc17/miniunz.vcxproj new file mode 100644 index 000000000000..68ef16588b29 --- /dev/null +++ b/zlib/contrib/vstudio/vc17/miniunz.vcxproj @@ -0,0 +1,409 @@ + + + + + Debug + ARM + + + Debug + ARM64 + + + Debug + Win32 + + + Debug + x64 + + + Release + ARM + + + Release + ARM64 + + + Release + Win32 + + + Release + x64 + + + + {C52F9E7B-498A-42BE-8DB4-85A15694382A} + Win32Proj + 10.0 + + + + Application + MultiByte + v143 + + + Application + Unicode + v143 + + + Application + MultiByte + v143 + + + Application + MultiByte + v143 + + + Application + MultiByte + v143 + + + Application + MultiByte + v143 + + + Application + MultiByte + v143 + + + Application + MultiByte + v143 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30128.1 + x86\MiniUnzip$(Configuration)\ + x86\MiniUnzip$(Configuration)\Tmp\ + true + false + x86\MiniUnzip$(Configuration)\ + x86\MiniUnzip$(Configuration)\Tmp\ + false + false + x64\MiniUnzip$(Configuration)\ + x64\MiniUnzip$(Configuration)\Tmp\ + true + true + true + false + false + false + x64\MiniUnzip$(Configuration)\ + x64\MiniUnzip$(Configuration)\Tmp\ + false + false + false + false + false + false + AllRules.ruleset + + + AllRules.ruleset + AllRules.ruleset + AllRules.ruleset + + + + + + + AllRules.ruleset + + + AllRules.ruleset + AllRules.ruleset + AllRules.ruleset + + + + + + + + + arm64\MiniUnzip$(Configuration)\ + arm64\MiniUnzip$(Configuration)\Tmp\ + + + arm64\MiniUnzip$(Configuration)\ + arm64\MiniUnzip$(Configuration)\Tmp\ + + + arm\MiniUnzip$(Configuration)\ + arm\MiniUnzip$(Configuration)\Tmp\ + + + arm\MiniUnzip$(Configuration)\ + arm\MiniUnzip$(Configuration)\Tmp\ + + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + x86\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)miniunz.exe + true + $(OutDir)miniunz.pdb + Console + false + + + MachineX86 + + + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + Default + MultiThreaded + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + x86\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)miniunz.exe + true + Console + true + true + false + + + MachineX86 + + + + + X64 + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)miniunz.exe + true + $(OutDir)miniunz.pdb + Console + MachineX64 + + + + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)miniunz.exe + true + $(OutDir)miniunz.pdb + Console + + + + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)miniunz.exe + true + $(OutDir)miniunz.pdb + Console + + + + + X64 + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDLL + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)miniunz.exe + true + Console + true + true + MachineX64 + + + + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDLL + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)miniunz.exe + true + Console + true + true + + + + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDLL + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)miniunz.exe + true + Console + true + true + + + + + + + + {8fd826f8-3739-44e6-8cc8-997122e53b8d} + + + + + + \ No newline at end of file diff --git a/zlib/contrib/vstudio/vc17/minizip.vcxproj b/zlib/contrib/vstudio/vc17/minizip.vcxproj new file mode 100644 index 000000000000..dd3c52e70c99 --- /dev/null +++ b/zlib/contrib/vstudio/vc17/minizip.vcxproj @@ -0,0 +1,405 @@ + + + + + Debug + ARM + + + Debug + ARM64 + + + Debug + Win32 + + + Debug + x64 + + + Release + ARM + + + Release + ARM64 + + + Release + Win32 + + + Release + x64 + + + + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B} + Win32Proj + 10.0 + + + + Application + MultiByte + v143 + + + Application + Unicode + v143 + + + Application + MultiByte + v143 + + + Application + MultiByte + v143 + + + Application + MultiByte + v143 + + + Application + MultiByte + v143 + + + Application + MultiByte + v143 + + + Application + MultiByte + v143 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30128.1 + x86\MiniZip$(Configuration)\ + x86\MiniZip$(Configuration)\Tmp\ + true + false + x86\MiniZip$(Configuration)\ + x86\MiniZip$(Configuration)\Tmp\ + false + x64\$(Configuration)\ + x64\$(Configuration)\ + true + true + true + false + false + false + x64\$(Configuration)\ + x64\$(Configuration)\ + false + false + false + AllRules.ruleset + + + AllRules.ruleset + AllRules.ruleset + AllRules.ruleset + + + + + + + AllRules.ruleset + + + AllRules.ruleset + AllRules.ruleset + AllRules.ruleset + + + + + + + + + arm64\MiniZip$(Configuration)\ + arm64\MiniZip$(Configuration)\Tmp\ + + + arm64\MiniZip$(Configuration)\ + arm64\MiniZip$(Configuration)\Tmp\ + + + arm\MiniZip$(Configuration)\ + arm\MiniZip$(Configuration)\Tmp\ + + + arm\MiniZip$(Configuration)\ + arm\MiniZip$(Configuration)\Tmp\ + + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + x86\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)minizip.exe + true + $(OutDir)minizip.pdb + Console + false + + + MachineX86 + + + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + Default + MultiThreaded + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + x86\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)minizip.exe + true + Console + true + true + false + + + MachineX86 + + + + + X64 + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)minizip.exe + true + $(OutDir)minizip.pdb + Console + MachineX64 + + + + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)minizip.exe + true + $(OutDir)minizip.pdb + Console + + + + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)minizip.exe + true + $(OutDir)minizip.pdb + Console + + + + + X64 + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDLL + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)minizip.exe + true + Console + true + true + MachineX64 + + + + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDLL + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)minizip.exe + true + Console + true + true + + + + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDLL + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)minizip.exe + true + Console + true + true + + + + + + + + {8fd826f8-3739-44e6-8cc8-997122e53b8d} + + + + + + \ No newline at end of file diff --git a/zlib/contrib/vstudio/vc17/testzlib.vcxproj b/zlib/contrib/vstudio/vc17/testzlib.vcxproj new file mode 100644 index 000000000000..4cc99b3ffe12 --- /dev/null +++ b/zlib/contrib/vstudio/vc17/testzlib.vcxproj @@ -0,0 +1,473 @@ + + + + + Debug + ARM + + + Debug + ARM64 + + + Debug + Win32 + + + Debug + x64 + + + ReleaseWithoutAsm + ARM + + + ReleaseWithoutAsm + ARM64 + + + ReleaseWithoutAsm + Win32 + + + ReleaseWithoutAsm + x64 + + + Release + ARM + + + Release + ARM64 + + + Release + Win32 + + + Release + x64 + + + + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B} + testzlib + Win32Proj + 10.0 + + + + Application + MultiByte + true + v143 + + + Application + MultiByte + true + v143 + + + Application + Unicode + v143 + + + Application + true + v143 + + + Application + true + v143 + + + Application + true + v143 + + + Application + true + v143 + + + Application + true + v143 + + + Application + true + v143 + + + Application + v143 + + + Application + v143 + + + Application + v143 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30128.1 + x86\TestZlib$(Configuration)\ + x86\TestZlib$(Configuration)\Tmp\ + true + false + x86\TestZlib$(Configuration)\ + x86\TestZlib$(Configuration)\Tmp\ + false + false + x86\TestZlib$(Configuration)\ + x86\TestZlib$(Configuration)\Tmp\ + false + false + x64\TestZlib$(Configuration)\ + x64\TestZlib$(Configuration)\Tmp\ + false + false + false + x64\TestZlib$(Configuration)\ + x64\TestZlib$(Configuration)\Tmp\ + false + false + false + x64\TestZlib$(Configuration)\ + x64\TestZlib$(Configuration)\Tmp\ + false + false + false + AllRules.ruleset + + + AllRules.ruleset + AllRules.ruleset + AllRules.ruleset + + + + + + + AllRules.ruleset + + + AllRules.ruleset + AllRules.ruleset + AllRules.ruleset + + + + + + + AllRules.ruleset + + + AllRules.ruleset + AllRules.ruleset + AllRules.ruleset + + + + + + + + + arm64\TestZlib$(Configuration)\ + arm64\TestZlib$(Configuration)\Tmp\ + + + arm64\TestZlib$(Configuration)\ + arm64\TestZlib$(Configuration)\Tmp\ + + + arm64\TestZlib$(Configuration)\ + arm64\TestZlib$(Configuration)\Tmp\ + + + arm\TestZlib$(Configuration)\ + arm\TestZlib$(Configuration)\Tmp\ + + + arm\TestZlib$(Configuration)\ + arm\TestZlib$(Configuration)\Tmp\ + + + arm\TestZlib$(Configuration)\ + arm\TestZlib$(Configuration)\Tmp\ + + + + Disabled + ..\..\..;%(AdditionalIncludeDirectories) + WIN32;ZLIB_WINAPI;_DEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + AssemblyAndSourceCode + $(IntDir) + Level3 + ProgramDatabase + + + %(AdditionalDependencies) + $(OutDir)testzlib.exe + true + $(OutDir)testzlib.pdb + Console + false + + + MachineX86 + + + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;%(AdditionalIncludeDirectories) + WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + true + Default + MultiThreaded + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + $(OutDir)testzlib.exe + true + Console + true + true + false + + + MachineX86 + + + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;%(AdditionalIncludeDirectories) + WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + true + Default + MultiThreaded + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + %(AdditionalDependencies) + $(OutDir)testzlib.exe + true + Console + true + true + false + + + MachineX86 + false + + + + + ..\..\..;%(AdditionalIncludeDirectories) + WIN32;ZLIB_WINAPI;_DEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + Default + MultiThreadedDebugDLL + false + $(IntDir) + + + %(AdditionalDependencies) + + + + + ..\..\..;%(AdditionalIncludeDirectories) + WIN32;ZLIB_WINAPI;_DEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + Default + MultiThreadedDebugDLL + false + $(IntDir) + + + %(AdditionalDependencies) + + + + + ..\..\..;%(AdditionalIncludeDirectories) + WIN32;ZLIB_WINAPI;_DEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + Default + MultiThreadedDebugDLL + false + $(IntDir) + + + %(AdditionalDependencies) + + + + + ..\..\..;%(AdditionalIncludeDirectories) + WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + Default + MultiThreadedDLL + false + $(IntDir) + + + %(AdditionalDependencies) + + + + + ..\..\..;%(AdditionalIncludeDirectories) + WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + Default + MultiThreadedDLL + false + $(IntDir) + + + %(AdditionalDependencies) + + + + + ..\..\..;%(AdditionalIncludeDirectories) + WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + Default + MultiThreadedDLL + false + $(IntDir) + + + %(AdditionalDependencies) + + + + + ..\..\..;%(AdditionalIncludeDirectories) + WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + Default + MultiThreadedDLL + false + $(IntDir) + + + %(AdditionalDependencies) + + + + + ..\..\..;%(AdditionalIncludeDirectories) + WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + Default + MultiThreadedDLL + false + $(IntDir) + + + %(AdditionalDependencies) + + + + + ..\..\..;%(AdditionalIncludeDirectories) + WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + Default + MultiThreadedDLL + false + $(IntDir) + + + %(AdditionalDependencies) + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/zlib/contrib/vstudio/vc17/testzlibdll.vcxproj b/zlib/contrib/vstudio/vc17/testzlibdll.vcxproj new file mode 100644 index 000000000000..73bba55da804 --- /dev/null +++ b/zlib/contrib/vstudio/vc17/testzlibdll.vcxproj @@ -0,0 +1,409 @@ + + + + + Debug + ARM + + + Debug + ARM64 + + + Debug + Win32 + + + Debug + x64 + + + Release + ARM + + + Release + ARM64 + + + Release + Win32 + + + Release + x64 + + + + {C52F9E7B-498A-42BE-8DB4-85A15694366A} + Win32Proj + 10.0 + + + + Application + MultiByte + v143 + + + Application + Unicode + v143 + + + Application + MultiByte + v143 + + + Application + MultiByte + v143 + + + Application + MultiByte + v143 + + + Application + MultiByte + v143 + + + Application + MultiByte + v143 + + + Application + MultiByte + v143 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30128.1 + x86\TestZlibDll$(Configuration)\ + x86\TestZlibDll$(Configuration)\Tmp\ + true + false + x86\TestZlibDll$(Configuration)\ + x86\TestZlibDll$(Configuration)\Tmp\ + false + false + x64\TestZlibDll$(Configuration)\ + x64\TestZlibDll$(Configuration)\Tmp\ + true + true + true + false + false + false + x64\TestZlibDll$(Configuration)\ + x64\TestZlibDll$(Configuration)\Tmp\ + false + false + false + false + false + false + AllRules.ruleset + + + AllRules.ruleset + AllRules.ruleset + AllRules.ruleset + + + + + + + AllRules.ruleset + + + AllRules.ruleset + AllRules.ruleset + AllRules.ruleset + + + + + + + + + arm64\TestZlibDll$(Configuration)\ + arm64\TestZlibDll$(Configuration)\Tmp\ + + + arm64\TestZlibDll$(Configuration)\ + arm64\TestZlibDll$(Configuration)\Tmp\ + + + arm\TestZlibDll$(Configuration)\ + arm\TestZlibDll$(Configuration)\Tmp\ + + + arm\TestZlibDll$(Configuration)\ + arm\TestZlibDll$(Configuration)\Tmp\ + + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + x86\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)testzlibdll.exe + true + $(OutDir)testzlib.pdb + Console + false + + + MachineX86 + + + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + Default + MultiThreaded + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + x86\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)testzlibdll.exe + true + Console + true + true + false + + + MachineX86 + + + + + X64 + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)testzlibdll.exe + true + $(OutDir)testzlib.pdb + Console + MachineX64 + + + + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)testzlibdll.exe + true + $(OutDir)testzlib.pdb + Console + + + + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)testzlibdll.exe + true + $(OutDir)testzlib.pdb + Console + + + + + X64 + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDLL + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)testzlibdll.exe + true + Console + true + true + MachineX64 + + + + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDLL + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)testzlibdll.exe + true + Console + true + true + + + + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDLL + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)testzlibdll.exe + true + Console + true + true + + + + + + + + {8fd826f8-3739-44e6-8cc8-997122e53b8d} + + + + + + \ No newline at end of file diff --git a/zlib/contrib/vstudio/vc17/zlib.rc b/zlib/contrib/vstudio/vc17/zlib.rc new file mode 100644 index 000000000000..a55f341c74c1 --- /dev/null +++ b/zlib/contrib/vstudio/vc17/zlib.rc @@ -0,0 +1,32 @@ +#include + +#define IDR_VERSION1 1 +IDR_VERSION1 VERSIONINFO MOVEABLE IMPURE LOADONCALL DISCARDABLE + FILEVERSION 1, 3, 1, 0 + PRODUCTVERSION 1, 3, 1, 0 + FILEFLAGSMASK VS_FFI_FILEFLAGSMASK + FILEFLAGS 0 + FILEOS VOS_DOS_WINDOWS32 + FILETYPE VFT_DLL + FILESUBTYPE 0 // not used +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904E4" + //language ID = U.S. English, char set = Windows, Multilingual + + BEGIN + VALUE "FileDescription", "zlib data compression and ZIP file I/O library\0" + VALUE "FileVersion", "1.3.1\0" + VALUE "InternalName", "zlib\0" + VALUE "OriginalFilename", "zlibwapi.dll\0" + VALUE "ProductName", "ZLib.DLL\0" + VALUE "Comments","DLL support by Alessandro Iacopetti & Gilles Vollant\0" + VALUE "LegalCopyright", "(C) 1995-2024 Jean-loup Gailly & Mark Adler\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x0409, 1252 + END +END diff --git a/zlib/contrib/vstudio/vc17/zlibstat.vcxproj b/zlib/contrib/vstudio/vc17/zlibstat.vcxproj new file mode 100644 index 000000000000..b946ac2a90fb --- /dev/null +++ b/zlib/contrib/vstudio/vc17/zlibstat.vcxproj @@ -0,0 +1,602 @@ + + + + + Debug + ARM + + + Debug + ARM64 + + + Debug + Win32 + + + Debug + x64 + + + ReleaseWithoutAsm + ARM + + + ReleaseWithoutAsm + ARM64 + + + ReleaseWithoutAsm + Win32 + + + ReleaseWithoutAsm + x64 + + + Release + ARM + + + Release + ARM64 + + + Release + Win32 + + + Release + x64 + + + + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8} + 10.0 + + + + StaticLibrary + false + v143 + + + StaticLibrary + false + v143 + + + StaticLibrary + false + v143 + Unicode + + + StaticLibrary + false + v143 + + + StaticLibrary + false + v143 + + + StaticLibrary + false + v143 + + + StaticLibrary + false + v143 + + + StaticLibrary + false + v143 + + + StaticLibrary + false + v143 + + + StaticLibrary + false + v143 + + + StaticLibrary + false + v143 + + + StaticLibrary + false + v143 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30128.1 + x86\ZlibStat$(Configuration)\ + x86\ZlibStat$(Configuration)\Tmp\ + x86\ZlibStat$(Configuration)\ + x86\ZlibStat$(Configuration)\Tmp\ + x86\ZlibStat$(Configuration)\ + x86\ZlibStat$(Configuration)\Tmp\ + x64\ZlibStat$(Configuration)\ + x64\ZlibStat$(Configuration)\Tmp\ + x64\ZlibStat$(Configuration)\ + x64\ZlibStat$(Configuration)\Tmp\ + x64\ZlibStat$(Configuration)\ + x64\ZlibStat$(Configuration)\Tmp\ + AllRules.ruleset + + + AllRules.ruleset + AllRules.ruleset + AllRules.ruleset + + + + + + + AllRules.ruleset + + + AllRules.ruleset + AllRules.ruleset + AllRules.ruleset + + + + + + + AllRules.ruleset + + + AllRules.ruleset + AllRules.ruleset + AllRules.ruleset + + + + + + + + + arm64\ZlibStat$(Configuration)\ + arm64\ZlibStat$(Configuration)\Tmp\ + + + arm64\ZlibStat$(Configuration)\ + arm64\ZlibStat$(Configuration)\Tmp\ + + + arm64\ZlibStat$(Configuration)\ + arm64\ZlibStat$(Configuration)\Tmp\ + + + arm\ZlibStat$(Configuration)\ + arm\ZlibStat$(Configuration)\Tmp\ + + + arm\ZlibStat$(Configuration)\ + arm\ZlibStat$(Configuration)\Tmp\ + + + arm\ZlibStat$(Configuration)\ + arm\ZlibStat$(Configuration)\Tmp\ + + + + Disabled + ..\..\..;%(AdditionalIncludeDirectories) + WIN32;ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + + + MultiThreadedDebugDLL + false + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + OldStyle + + + 0x040c + + + /MACHINE:X86 /NODEFAULTLIB %(AdditionalOptions) + $(OutDir)zlibstat.lib + true + + + + + OnlyExplicitInline + ..\..\..;%(AdditionalIncludeDirectories) + WIN32;ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + true + + + MultiThreaded + false + true + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + + + 0x040c + + + /MACHINE:X86 /NODEFAULTLIB %(AdditionalOptions) + %(AdditionalDependencies) + $(OutDir)zlibstat.lib + true + + + + + OnlyExplicitInline + ..\..\..;%(AdditionalIncludeDirectories) + WIN32;ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + true + + + MultiThreaded + false + true + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + + + 0x040c + + + /MACHINE:X86 /NODEFAULTLIB %(AdditionalOptions) + $(OutDir)zlibstat.lib + true + + + + + X64 + + + Disabled + ..\..\..;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) + + + MultiThreadedDebugDLL + false + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + OldStyle + + + 0x040c + + + /MACHINE:AMD64 /NODEFAULTLIB %(AdditionalOptions) + $(OutDir)zlibstat.lib + true + + + + + + Disabled + ..\..\..;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) + + + MultiThreadedDebugDLL + false + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + OldStyle + + + 0x040c + + + /MACHINE:ARM64 /NODEFAULTLIB %(AdditionalOptions) + $(OutDir)zlibstat.lib + true + + + + + + Disabled + ..\..\..;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) + + + MultiThreadedDebugDLL + false + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + OldStyle + + + 0x040c + + + /MACHINE:ARM /NODEFAULTLIB %(AdditionalOptions) + $(OutDir)zlibstat.lib + true + + + + + X64 + + + OnlyExplicitInline + ..\..\..;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + + + 0x040c + + + /MACHINE:AMD64 /NODEFAULTLIB %(AdditionalOptions) + %(AdditionalDependencies) + $(OutDir)zlibstat.lib + true + + + + + + OnlyExplicitInline + ..\..\..;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + + + 0x040c + + + /MACHINE:ARM64 /NODEFAULTLIB %(AdditionalOptions) + %(AdditionalDependencies) + $(OutDir)zlibstat.lib + true + + + + + + OnlyExplicitInline + ..\..\..;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + + + 0x040c + + + /MACHINE:ARM /NODEFAULTLIB %(AdditionalOptions) + %(AdditionalDependencies) + $(OutDir)zlibstat.lib + true + + + + + X64 + + + OnlyExplicitInline + ..\..\..;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + + + 0x040c + + + /MACHINE:AMD64 /NODEFAULTLIB %(AdditionalOptions) + $(OutDir)zlibstat.lib + true + + + + + + OnlyExplicitInline + ..\..\..;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + + + 0x040c + + + /MACHINE:ARM64 /NODEFAULTLIB %(AdditionalOptions) + $(OutDir)zlibstat.lib + true + + + + + + OnlyExplicitInline + ..\..\..;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + + + 0x040c + + + /MACHINE:ARM /NODEFAULTLIB %(AdditionalOptions) + $(OutDir)zlibstat.lib + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/zlib/contrib/vstudio/vc17/zlibvc.def b/zlib/contrib/vstudio/vc17/zlibvc.def new file mode 100644 index 000000000000..53947cc31b72 --- /dev/null +++ b/zlib/contrib/vstudio/vc17/zlibvc.def @@ -0,0 +1,158 @@ +LIBRARY +; zlib data compression and ZIP file I/O library + +VERSION 1.3.1 + +EXPORTS + adler32 @1 + compress @2 + crc32 @3 + deflate @4 + deflateCopy @5 + deflateEnd @6 + deflateInit2_ @7 + deflateInit_ @8 + deflateParams @9 + deflateReset @10 + deflateSetDictionary @11 + gzclose @12 + gzdopen @13 + gzerror @14 + gzflush @15 + gzopen @16 + gzread @17 + gzwrite @18 + inflate @19 + inflateEnd @20 + inflateInit2_ @21 + inflateInit_ @22 + inflateReset @23 + inflateSetDictionary @24 + inflateSync @25 + uncompress @26 + zlibVersion @27 + gzprintf @28 + gzputc @29 + gzgetc @30 + gzseek @31 + gzrewind @32 + gztell @33 + gzeof @34 + gzsetparams @35 + zError @36 + inflateSyncPoint @37 + get_crc_table @38 + compress2 @39 + gzputs @40 + gzgets @41 + inflateCopy @42 + inflateBackInit_ @43 + inflateBack @44 + inflateBackEnd @45 + compressBound @46 + deflateBound @47 + gzclearerr @48 + gzungetc @49 + zlibCompileFlags @50 + deflatePrime @51 + deflatePending @52 + + unzOpen @61 + unzClose @62 + unzGetGlobalInfo @63 + unzGetCurrentFileInfo @64 + unzGoToFirstFile @65 + unzGoToNextFile @66 + unzOpenCurrentFile @67 + unzReadCurrentFile @68 + unzOpenCurrentFile3 @69 + unztell @70 + unzeof @71 + unzCloseCurrentFile @72 + unzGetGlobalComment @73 + unzStringFileNameCompare @74 + unzLocateFile @75 + unzGetLocalExtrafield @76 + unzOpen2 @77 + unzOpenCurrentFile2 @78 + unzOpenCurrentFilePassword @79 + + zipOpen @80 + zipOpenNewFileInZip @81 + zipWriteInFileInZip @82 + zipCloseFileInZip @83 + zipClose @84 + zipOpenNewFileInZip2 @86 + zipCloseFileInZipRaw @87 + zipOpen2 @88 + zipOpenNewFileInZip3 @89 + + unzGetFilePos @100 + unzGoToFilePos @101 + + fill_win32_filefunc @110 + +; zlibwapi v1.2.4 added: + fill_win32_filefunc64 @111 + fill_win32_filefunc64A @112 + fill_win32_filefunc64W @113 + + unzOpen64 @120 + unzOpen2_64 @121 + unzGetGlobalInfo64 @122 + unzGetCurrentFileInfo64 @124 + unzGetCurrentFileZStreamPos64 @125 + unztell64 @126 + unzGetFilePos64 @127 + unzGoToFilePos64 @128 + + zipOpen64 @130 + zipOpen2_64 @131 + zipOpenNewFileInZip64 @132 + zipOpenNewFileInZip2_64 @133 + zipOpenNewFileInZip3_64 @134 + zipOpenNewFileInZip4_64 @135 + zipCloseFileInZipRaw64 @136 + +; zlib1 v1.2.4 added: + adler32_combine @140 + crc32_combine @142 + deflateSetHeader @144 + deflateTune @145 + gzbuffer @146 + gzclose_r @147 + gzclose_w @148 + gzdirect @149 + gzoffset @150 + inflateGetHeader @156 + inflateMark @157 + inflatePrime @158 + inflateReset2 @159 + inflateUndermine @160 + +; zlib1 v1.2.6 added: + gzgetc_ @161 + inflateResetKeep @163 + deflateResetKeep @164 + +; zlib1 v1.2.7 added: + gzopen_w @165 + +; zlib1 v1.2.8 added: + inflateGetDictionary @166 + gzvprintf @167 + +; zlib1 v1.2.9 added: + inflateCodesUsed @168 + inflateValidate @169 + uncompress2 @170 + gzfread @171 + gzfwrite @172 + deflateGetDictionary @173 + adler32_z @174 + crc32_z @175 + +; zlib1 v1.2.12 added: + crc32_combine_gen @176 + crc32_combine_gen64 @177 + crc32_combine_op @178 diff --git a/zlib/contrib/vstudio/vc17/zlibvc.sln b/zlib/contrib/vstudio/vc17/zlibvc.sln new file mode 100644 index 000000000000..67896b7470da --- /dev/null +++ b/zlib/contrib/vstudio/vc17/zlibvc.sln @@ -0,0 +1,179 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.4.33015.44 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "zlibvc", "zlibvc.vcxproj", "{8FD826F8-3739-44E6-8CC8-997122E53B8D}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "zlibstat", "zlibstat.vcxproj", "{745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testzlib", "testzlib.vcxproj", "{AA6666AA-E09F-4135-9C0C-4FE50C3C654B}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testzlibdll", "testzlibdll.vcxproj", "{C52F9E7B-498A-42BE-8DB4-85A15694366A}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "minizip", "minizip.vcxproj", "{48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "miniunz", "miniunz.vcxproj", "{C52F9E7B-498A-42BE-8DB4-85A15694382A}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|ARM = Debug|ARM + Debug|ARM64 = Debug|ARM64 + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 + Release|ARM = Release|ARM + Release|ARM64 = Release|ARM64 + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + ReleaseWithoutAsm|ARM = ReleaseWithoutAsm|ARM + ReleaseWithoutAsm|ARM64 = ReleaseWithoutAsm|ARM64 + ReleaseWithoutAsm|Win32 = ReleaseWithoutAsm|Win32 + ReleaseWithoutAsm|x64 = ReleaseWithoutAsm|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|ARM.ActiveCfg = Debug|ARM + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|ARM.Build.0 = Debug|ARM + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|ARM64.Build.0 = Debug|ARM64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|Win32.ActiveCfg = Debug|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|Win32.Build.0 = Debug|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|x64.ActiveCfg = Debug|x64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|x64.Build.0 = Debug|x64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|ARM.ActiveCfg = Release|ARM + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|ARM.Build.0 = Release|ARM + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|ARM64.ActiveCfg = Release|ARM64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|ARM64.Build.0 = Release|ARM64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|Win32.ActiveCfg = Release|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|Win32.Build.0 = Release|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|x64.ActiveCfg = Release|x64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|x64.Build.0 = Release|x64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|ARM.ActiveCfg = ReleaseWithoutAsm|ARM + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|ARM.Build.0 = ReleaseWithoutAsm|ARM + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|ARM64.ActiveCfg = ReleaseWithoutAsm|ARM64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|ARM64.Build.0 = ReleaseWithoutAsm|ARM64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|Win32.ActiveCfg = ReleaseWithoutAsm|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|Win32.Build.0 = ReleaseWithoutAsm|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|x64.ActiveCfg = ReleaseWithoutAsm|x64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|x64.Build.0 = ReleaseWithoutAsm|x64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|ARM.ActiveCfg = Debug|ARM + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|ARM.Build.0 = Debug|ARM + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|ARM64.Build.0 = Debug|ARM64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|Win32.ActiveCfg = Debug|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|Win32.Build.0 = Debug|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|x64.ActiveCfg = Debug|x64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|x64.Build.0 = Debug|x64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|ARM.ActiveCfg = Release|ARM + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|ARM.Build.0 = Release|ARM + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|ARM64.ActiveCfg = Release|ARM64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|ARM64.Build.0 = Release|ARM64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|Win32.ActiveCfg = Release|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|Win32.Build.0 = Release|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|x64.ActiveCfg = Release|x64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|x64.Build.0 = Release|x64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|ARM.ActiveCfg = ReleaseWithoutAsm|ARM + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|ARM.Build.0 = ReleaseWithoutAsm|ARM + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|ARM64.ActiveCfg = ReleaseWithoutAsm|ARM64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|ARM64.Build.0 = ReleaseWithoutAsm|ARM64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|Win32.ActiveCfg = ReleaseWithoutAsm|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|Win32.Build.0 = ReleaseWithoutAsm|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|x64.ActiveCfg = ReleaseWithoutAsm|x64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|x64.Build.0 = ReleaseWithoutAsm|x64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|ARM.ActiveCfg = Debug|ARM + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|ARM.Build.0 = Debug|ARM + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|ARM64.Build.0 = Debug|ARM64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|Win32.ActiveCfg = Debug|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|Win32.Build.0 = Debug|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|x64.ActiveCfg = Debug|x64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|x64.Build.0 = Debug|x64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|ARM.ActiveCfg = Release|ARM + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|ARM.Build.0 = Release|ARM + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|ARM64.ActiveCfg = Release|ARM64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|ARM64.Build.0 = Release|ARM64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|Win32.ActiveCfg = Release|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|Win32.Build.0 = Release|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|x64.ActiveCfg = Release|x64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|x64.Build.0 = Release|x64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|ARM.ActiveCfg = ReleaseWithoutAsm|ARM + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|ARM.Build.0 = ReleaseWithoutAsm|ARM + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|ARM64.ActiveCfg = ReleaseWithoutAsm|ARM64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|ARM64.Build.0 = ReleaseWithoutAsm|ARM64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Win32.ActiveCfg = ReleaseWithoutAsm|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Win32.Build.0 = ReleaseWithoutAsm|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|x64.ActiveCfg = ReleaseWithoutAsm|x64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|x64.Build.0 = ReleaseWithoutAsm|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|ARM.ActiveCfg = Debug|ARM + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|ARM.Build.0 = Debug|ARM + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|ARM64.Build.0 = Debug|ARM64 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|Win32.ActiveCfg = Debug|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|Win32.Build.0 = Debug|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|x64.ActiveCfg = Debug|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|x64.Build.0 = Debug|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|ARM.ActiveCfg = Release|ARM + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|ARM.Build.0 = Release|ARM + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|ARM64.ActiveCfg = Release|ARM64 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|ARM64.Build.0 = Release|ARM64 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|Win32.ActiveCfg = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|Win32.Build.0 = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|x64.ActiveCfg = Release|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|x64.Build.0 = Release|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.ReleaseWithoutAsm|ARM.ActiveCfg = Release|ARM + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.ReleaseWithoutAsm|ARM.Build.0 = Release|ARM + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.ReleaseWithoutAsm|ARM64.ActiveCfg = Release|ARM64 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.ReleaseWithoutAsm|ARM64.Build.0 = Release|ARM64 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.ReleaseWithoutAsm|Win32.ActiveCfg = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.ReleaseWithoutAsm|x64.ActiveCfg = Release|x64 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|ARM.ActiveCfg = Debug|ARM + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|ARM.Build.0 = Debug|ARM + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|ARM64.Build.0 = Debug|ARM64 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|Win32.ActiveCfg = Debug|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|Win32.Build.0 = Debug|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|x64.ActiveCfg = Debug|x64 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|x64.Build.0 = Debug|x64 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|ARM.ActiveCfg = Release|ARM + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|ARM.Build.0 = Release|ARM + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|ARM64.ActiveCfg = Release|ARM64 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|ARM64.Build.0 = Release|ARM64 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|Win32.ActiveCfg = Release|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|Win32.Build.0 = Release|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|x64.ActiveCfg = Release|x64 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|x64.Build.0 = Release|x64 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|ARM.ActiveCfg = Release|ARM + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|ARM.Build.0 = Release|ARM + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|ARM64.ActiveCfg = Release|ARM64 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|ARM64.Build.0 = Release|ARM64 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Win32.ActiveCfg = Release|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|x64.ActiveCfg = Release|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|ARM.ActiveCfg = Debug|ARM + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|ARM.Build.0 = Debug|ARM + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|ARM64.Build.0 = Debug|ARM64 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|Win32.ActiveCfg = Debug|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|Win32.Build.0 = Debug|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|x64.ActiveCfg = Debug|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|x64.Build.0 = Debug|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|ARM.ActiveCfg = Release|ARM + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|ARM.Build.0 = Release|ARM + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|ARM64.ActiveCfg = Release|ARM64 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|ARM64.Build.0 = Release|ARM64 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|Win32.ActiveCfg = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|Win32.Build.0 = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|x64.ActiveCfg = Release|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|x64.Build.0 = Release|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.ReleaseWithoutAsm|ARM.ActiveCfg = Release|ARM + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.ReleaseWithoutAsm|ARM.Build.0 = Release|ARM + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.ReleaseWithoutAsm|ARM64.ActiveCfg = Release|ARM64 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.ReleaseWithoutAsm|ARM64.Build.0 = Release|ARM64 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.ReleaseWithoutAsm|Win32.ActiveCfg = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.ReleaseWithoutAsm|x64.ActiveCfg = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {EAA58685-56D9-43F2-8703-FD2CB020745E} + EndGlobalSection +EndGlobal diff --git a/zlib/contrib/vstudio/vc17/zlibvc.vcxproj b/zlib/contrib/vstudio/vc17/zlibvc.vcxproj new file mode 100644 index 000000000000..10a7a901efed --- /dev/null +++ b/zlib/contrib/vstudio/vc17/zlibvc.vcxproj @@ -0,0 +1,875 @@ + + + + + Debug + ARM + + + Debug + ARM64 + + + Debug + Win32 + + + Debug + x64 + + + ReleaseWithoutAsm + ARM + + + ReleaseWithoutAsm + ARM64 + + + ReleaseWithoutAsm + Win32 + + + ReleaseWithoutAsm + x64 + + + Release + ARM + + + Release + ARM64 + + + Release + Win32 + + + Release + x64 + + + + {8FD826F8-3739-44E6-8CC8-997122E53B8D} + 10.0 + + + + DynamicLibrary + false + true + v143 + + + DynamicLibrary + false + true + v143 + + + DynamicLibrary + false + v143 + Unicode + + + DynamicLibrary + false + true + v143 + + + DynamicLibrary + false + true + v143 + + + DynamicLibrary + false + true + v143 + + + DynamicLibrary + false + true + v143 + + + DynamicLibrary + false + true + v143 + + + DynamicLibrary + false + true + v143 + + + DynamicLibrary + false + v143 + + + DynamicLibrary + false + v143 + + + DynamicLibrary + false + v143 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30128.1 + x86\ZlibDll$(Configuration)\ + x86\ZlibDll$(Configuration)\Tmp\ + true + false + x86\ZlibDll$(Configuration)\ + x86\ZlibDll$(Configuration)\Tmp\ + false + false + x86\ZlibDll$(Configuration)\ + x86\ZlibDll$(Configuration)\Tmp\ + false + false + x64\ZlibDll$(Configuration)\ + x64\ZlibDll$(Configuration)\Tmp\ + true + true + true + false + false + false + x64\ZlibDll$(Configuration)\ + x64\ZlibDll$(Configuration)\Tmp\ + false + false + false + false + false + false + x64\ZlibDll$(Configuration)\ + x64\ZlibDll$(Configuration)\Tmp\ + false + false + false + false + false + false + AllRules.ruleset + + + AllRules.ruleset + AllRules.ruleset + AllRules.ruleset + + + + + + + AllRules.ruleset + + + AllRules.ruleset + AllRules.ruleset + AllRules.ruleset + + + + + + + AllRules.ruleset + + + AllRules.ruleset + AllRules.ruleset + AllRules.ruleset + + + + + + + zlibwapi + zlibwapi + zlibwapi + zlibwapi + zlibwapi + zlibwapi + zlibwapi + zlibwapi + zlibwapi + zlibwapi + zlibwapi + zlibwapi + + + arm64\ZlibDll$(Configuration)\ + arm64\ZlibDll$(Configuration)\Tmp\ + + + arm\ZlibDll$(Configuration)\ + arm\ZlibDll$(Configuration)\Tmp\ + + + arm64\ZlibDll$(Configuration)\ + arm64\ZlibDll$(Configuration)\Tmp\ + + + arm64\ZlibDll$(Configuration)\ + arm64\ZlibDll$(Configuration)\Tmp\ + + + arm\ZlibDll$(Configuration)\ + arm\ZlibDll$(Configuration)\Tmp\ + + + arm\ZlibDll$(Configuration)\ + arm\ZlibDll$(Configuration)\Tmp\ + + + + _DEBUG;%(PreprocessorDefinitions) + true + true + Win32 + $(OutDir)zlibvc.tlb + + + Disabled + ..\..\..;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;%(PreprocessorDefinitions) + + + MultiThreadedDebugDLL + false + $(IntDir)zlibvc.pch + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x040c + + + /MACHINE:I386 %(AdditionalOptions) + %(AdditionalDependencies) + $(OutDir)zlibwapi.dll + true + .\zlibvc.def + true + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + false + + + $(OutDir)zlibwapi.lib + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + Win32 + $(OutDir)zlibvc.tlb + + + OnlyExplicitInline + ..\..\..;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibvc.pch + All + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x040c + + + /MACHINE:I386 %(AdditionalOptions) + $(OutDir)zlibwapi.dll + true + false + .\zlibvc.def + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + false + + + $(OutDir)zlibwapi.lib + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + Win32 + $(OutDir)zlibvc.tlb + + + OnlyExplicitInline + ..\..\..;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;%(PreprocessorDefinitions) + true + + + MultiThreaded + false + true + $(IntDir)zlibvc.pch + All + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x040c + + + /MACHINE:I386 %(AdditionalOptions) + %(AdditionalDependencies) + $(OutDir)zlibwapi.dll + true + false + .\zlibvc.def + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + false + + + $(OutDir)zlibwapi.lib + false + + + + + _DEBUG;%(PreprocessorDefinitions) + true + true + X64 + $(OutDir)zlibvc.tlb + + + Disabled + ..\..\..;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions) + + + MultiThreadedDebugDLL + false + $(IntDir)zlibvc.pch + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x040c + + + %(AdditionalDependencies) + $(OutDir)zlibwapi.dll + true + .\zlibvc.def + true + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + $(OutDir)zlibwapi.lib + MachineX64 + + + + + _DEBUG;%(PreprocessorDefinitions) + true + true + $(OutDir)zlibvc.tlb + + + Disabled + ..\..\..;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions) + + + MultiThreadedDebugDLL + false + $(IntDir)zlibvc.pch + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x040c + + + %(AdditionalDependencies) + $(OutDir)zlibwapi.dll + true + .\zlibvc.def + true + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + $(OutDir)zlibwapi.lib + + + + + _DEBUG;%(PreprocessorDefinitions) + true + true + $(OutDir)zlibvc.tlb + + + Disabled + ..\..\..;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions) + + + MultiThreadedDebugDLL + false + $(IntDir)zlibvc.pch + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x040c + + + %(AdditionalDependencies) + $(OutDir)zlibwapi.dll + true + .\zlibvc.def + true + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + $(OutDir)zlibwapi.lib + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + X64 + $(OutDir)zlibvc.tlb + + + OnlyExplicitInline + ..\..\..;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibvc.pch + All + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x040c + + + $(OutDir)zlibwapi.dll + true + false + .\zlibvc.def + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + $(OutDir)zlibwapi.lib + MachineX64 + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + $(OutDir)zlibvc.tlb + + + OnlyExplicitInline + ..\..\..;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibvc.pch + All + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x040c + + + $(OutDir)zlibwapi.dll + true + false + .\zlibvc.def + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + $(OutDir)zlibwapi.lib + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + $(OutDir)zlibvc.tlb + + + OnlyExplicitInline + ..\..\..;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibvc.pch + All + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x040c + + + $(OutDir)zlibwapi.dll + true + false + .\zlibvc.def + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + $(OutDir)zlibwapi.lib + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + X64 + $(OutDir)zlibvc.tlb + + + OnlyExplicitInline + ..\..\..;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibvc.pch + All + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x040c + + + %(AdditionalDependencies) + $(OutDir)zlibwapi.dll + true + false + .\zlibvc.def + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + $(OutDir)zlibwapi.lib + MachineX64 + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + $(OutDir)zlibvc.tlb + + + OnlyExplicitInline + ..\..\..;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibvc.pch + All + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x040c + + + %(AdditionalDependencies) + $(OutDir)zlibwapi.dll + true + false + .\zlibvc.def + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + $(OutDir)zlibwapi.lib + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + $(OutDir)zlibvc.tlb + + + OnlyExplicitInline + ..\..\..;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN32;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibvc.pch + All + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x040c + + + %(AdditionalDependencies) + $(OutDir)zlibwapi.dll + true + false + .\zlibvc.def + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + $(OutDir)zlibwapi.lib + + + + + + + + + + + + + + + + + + + + + %(AdditionalIncludeDirectories) + ZLIB_INTERNAL;%(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) + ZLIB_INTERNAL;%(PreprocessorDefinitions) + ZLIB_INTERNAL;%(PreprocessorDefinitions) + ZLIB_INTERNAL;%(PreprocessorDefinitions) + + + %(AdditionalIncludeDirectories) + ZLIB_INTERNAL;%(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) + ZLIB_INTERNAL;%(PreprocessorDefinitions) + ZLIB_INTERNAL;%(PreprocessorDefinitions) + ZLIB_INTERNAL;%(PreprocessorDefinitions) + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/zlib/contrib/vstudio/vc9/miniunz.vcproj b/zlib/contrib/vstudio/vc9/miniunz.vcproj index 7da32b91eafb..cc3d13a10c05 100644 --- a/zlib/contrib/vstudio/vc9/miniunz.vcproj +++ b/zlib/contrib/vstudio/vc9/miniunz.vcproj @@ -542,7 +542,7 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/zlib/contrib/vstudio/vc9/testzlibdll.vcproj b/zlib/contrib/vstudio/vc9/testzlibdll.vcproj index b1ddde05f984..6448b497cd56 100644 --- a/zlib/contrib/vstudio/vc9/testzlibdll.vcproj +++ b/zlib/contrib/vstudio/vc9/testzlibdll.vcproj @@ -542,7 +542,7 @@ @@ -343,8 +342,8 @@ @@ -418,7 +416,7 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/zlib/contrib/vstudio/vc9/zlibvc.def b/zlib/contrib/vstudio/vc9/zlibvc.def index 54e683d99c35..3234a02d9537 100644 --- a/zlib/contrib/vstudio/vc9/zlibvc.def +++ b/zlib/contrib/vstudio/vc9/zlibvc.def @@ -1,7 +1,7 @@ LIBRARY ; zlib data compression and ZIP file I/O library -VERSION 1.2 +VERSION 1.3.1 EXPORTS adler32 @1 @@ -151,3 +151,8 @@ EXPORTS deflateGetDictionary @173 adler32_z @174 crc32_z @175 + +; zlib1 v1.2.12 added: + crc32_combine_gen @176 + crc32_combine_gen64 @177 + crc32_combine_op @178 diff --git a/zlib/contrib/vstudio/vc9/zlibvc.vcproj b/zlib/contrib/vstudio/vc9/zlibvc.vcproj index c9a89471e703..f11dd1fbf3c6 100644 --- a/zlib/contrib/vstudio/vc9/zlibvc.vcproj +++ b/zlib/contrib/vstudio/vc9/zlibvc.vcproj @@ -53,8 +53,8 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/zlib/crc32.c b/zlib/crc32.c index affcd464ed31..6c38f5c04c6a 100644 --- a/zlib/crc32.c +++ b/zlib/crc32.c @@ -1,24 +1,23 @@ /* crc32.c -- compute the CRC-32 of a data stream - * Copyright (C) 1995-2006, 2010, 2011, 2012, 2016 Mark Adler + * Copyright (C) 1995-2022 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h * - * Thanks to Rodney Brown for his contribution of faster - * CRC methods: exclusive-oring 32 bits of data at a time, and pre-computing - * tables for updating the shift register in one step with three exclusive-ors - * instead of four steps with four exclusive-ors. This results in about a - * factor of two increase in speed on a Power PC G4 (PPC7455) using gcc -O3. + * This interleaved implementation of a CRC makes use of pipelined multiple + * arithmetic-logic units, commonly found in modern CPU cores. It is due to + * Kadatch and Jenkins (2010). See doc/crc-doc.1.0.pdf in this distribution. */ -/* @(#) $Id: crc32.c,v 1.1.1.2 2002/03/11 21:53:23 tromey Exp $ */ +/* @(#) $Id$ */ /* Note on the use of DYNAMIC_CRC_TABLE: there is no mutex or semaphore protection on the static variables used to control the first-use generation - of the crc tables. Therefore, if you #define DYNAMIC_CRC_TABLE, you should + of the crc tables. Therefore, if you #define DYNAMIC_CRC_TABLE, you should first call get_crc_table() to initialize the tables before allowing more than one thread to use crc32(). - DYNAMIC_CRC_TABLE and MAKECRCH can be #defined to write out crc32.h. + MAKECRCH can be #defined to write out crc32.h. A main() routine is also + produced, so that this one source file can be compiled to an executable. */ #ifdef MAKECRCH @@ -28,415 +27,1023 @@ # endif /* !DYNAMIC_CRC_TABLE */ #endif /* MAKECRCH */ -#include "zutil.h" /* for STDC and FAR definitions */ +#include "zutil.h" /* for Z_U4, Z_U8, z_crc_t, and FAR definitions */ -/* Definitions for doing the crc four data bytes at a time. */ -#if !defined(NOBYFOUR) && defined(Z_U4) -# define BYFOUR + /* + A CRC of a message is computed on N braids of words in the message, where + each word consists of W bytes (4 or 8). If N is 3, for example, then three + running sparse CRCs are calculated respectively on each braid, at these + indices in the array of words: 0, 3, 6, ..., 1, 4, 7, ..., and 2, 5, 8, ... + This is done starting at a word boundary, and continues until as many blocks + of N * W bytes as are available have been processed. The results are combined + into a single CRC at the end. For this code, N must be in the range 1..6 and + W must be 4 or 8. The upper limit on N can be increased if desired by adding + more #if blocks, extending the patterns apparent in the code. In addition, + crc32.h would need to be regenerated, if the maximum N value is increased. + + N and W are chosen empirically by benchmarking the execution time on a given + processor. The choices for N and W below were based on testing on Intel Kaby + Lake i7, AMD Ryzen 7, ARM Cortex-A57, Sparc64-VII, PowerPC POWER9, and MIPS64 + Octeon II processors. The Intel, AMD, and ARM processors were all fastest + with N=5, W=8. The Sparc, PowerPC, and MIPS64 were all fastest at N=5, W=4. + They were all tested with either gcc or clang, all using the -O3 optimization + level. Your mileage may vary. + */ + +/* Define N */ +#ifdef Z_TESTN +# define N Z_TESTN +#else +# define N 5 +#endif +#if N < 1 || N > 6 +# error N must be in 1..6 #endif -#ifdef BYFOUR - local unsigned long crc32_little OF((unsigned long, - const unsigned char FAR *, z_size_t)); - local unsigned long crc32_big OF((unsigned long, - const unsigned char FAR *, z_size_t)); -# define TBLS 8 + +/* + z_crc_t must be at least 32 bits. z_word_t must be at least as long as + z_crc_t. It is assumed here that z_word_t is either 32 bits or 64 bits, and + that bytes are eight bits. + */ + +/* + Define W and the associated z_word_t type. If W is not defined, then a + braided calculation is not used, and the associated tables and code are not + compiled. + */ +#ifdef Z_TESTW +# if Z_TESTW-1 != -1 +# define W Z_TESTW +# endif #else -# define TBLS 1 -#endif /* BYFOUR */ +# ifdef MAKECRCH +# define W 8 /* required for MAKECRCH */ +# else +# if defined(__x86_64__) || defined(__aarch64__) +# define W 8 +# else +# define W 4 +# endif +# endif +#endif +#ifdef W +# if W == 8 && defined(Z_U8) + typedef Z_U8 z_word_t; +# elif defined(Z_U4) +# undef W +# define W 4 + typedef Z_U4 z_word_t; +# else +# undef W +# endif +#endif -/* Local functions for crc concatenation */ -local unsigned long gf2_matrix_times OF((unsigned long *mat, - unsigned long vec)); -local void gf2_matrix_square OF((unsigned long *square, unsigned long *mat)); -local uLong crc32_combine_ OF((uLong crc1, uLong crc2, z_off64_t len2)); +/* If available, use the ARM processor CRC32 instruction. */ +#if defined(__aarch64__) && defined(__ARM_FEATURE_CRC32) && W == 8 +# define ARMCRC32 +#endif +#if defined(W) && (!defined(ARMCRC32) || defined(DYNAMIC_CRC_TABLE)) +/* + Swap the bytes in a z_word_t to convert between little and big endian. Any + self-respecting compiler will optimize this to a single machine byte-swap + instruction, if one is available. This assumes that word_t is either 32 bits + or 64 bits. + */ +local z_word_t byte_swap(z_word_t word) { +# if W == 8 + return + (word & 0xff00000000000000) >> 56 | + (word & 0xff000000000000) >> 40 | + (word & 0xff0000000000) >> 24 | + (word & 0xff00000000) >> 8 | + (word & 0xff000000) << 8 | + (word & 0xff0000) << 24 | + (word & 0xff00) << 40 | + (word & 0xff) << 56; +# else /* W == 4 */ + return + (word & 0xff000000) >> 24 | + (word & 0xff0000) >> 8 | + (word & 0xff00) << 8 | + (word & 0xff) << 24; +# endif +} +#endif #ifdef DYNAMIC_CRC_TABLE +/* ========================================================================= + * Table of powers of x for combining CRC-32s, filled in by make_crc_table() + * below. + */ + local z_crc_t FAR x2n_table[32]; +#else +/* ========================================================================= + * Tables for byte-wise and braided CRC-32 calculations, and a table of powers + * of x for combining CRC-32s, all made by make_crc_table(). + */ +# include "crc32.h" +#endif + +/* CRC polynomial. */ +#define POLY 0xedb88320 /* p(x) reflected, with x^32 implied */ -local volatile int crc_table_empty = 1; -local z_crc_t FAR crc_table[TBLS][256]; -local void make_crc_table OF((void)); +/* + Return a(x) multiplied by b(x) modulo p(x), where p(x) is the CRC polynomial, + reflected. For speed, this requires that a not be zero. + */ +local z_crc_t multmodp(z_crc_t a, z_crc_t b) { + z_crc_t m, p; + + m = (z_crc_t)1 << 31; + p = 0; + for (;;) { + if (a & m) { + p ^= b; + if ((a & (m - 1)) == 0) + break; + } + m >>= 1; + b = b & 1 ? (b >> 1) ^ POLY : b >> 1; + } + return p; +} + +/* + Return x^(n * 2^k) modulo p(x). Requires that x2n_table[] has been + initialized. + */ +local z_crc_t x2nmodp(z_off64_t n, unsigned k) { + z_crc_t p; + + p = (z_crc_t)1 << 31; /* x^0 == 1 */ + while (n) { + if (n & 1) + p = multmodp(x2n_table[k & 31], p); + n >>= 1; + k++; + } + return p; +} + +#ifdef DYNAMIC_CRC_TABLE +/* ========================================================================= + * Build the tables for byte-wise and braided CRC-32 calculations, and a table + * of powers of x for combining CRC-32s. + */ +local z_crc_t FAR crc_table[256]; +#ifdef W + local z_word_t FAR crc_big_table[256]; + local z_crc_t FAR crc_braid_table[W][256]; + local z_word_t FAR crc_braid_big_table[W][256]; + local void braid(z_crc_t [][256], z_word_t [][256], int, int); +#endif #ifdef MAKECRCH - local void write_table OF((FILE *, const z_crc_t FAR *)); + local void write_table(FILE *, const z_crc_t FAR *, int); + local void write_table32hi(FILE *, const z_word_t FAR *, int); + local void write_table64(FILE *, const z_word_t FAR *, int); #endif /* MAKECRCH */ + +/* + Define a once() function depending on the availability of atomics. If this is + compiled with DYNAMIC_CRC_TABLE defined, and if CRCs will be computed in + multiple threads, and if atomics are not available, then get_crc_table() must + be called to initialize the tables and must return before any threads are + allowed to compute or combine CRCs. + */ + +/* Definition of once functionality. */ +typedef struct once_s once_t; + +/* Check for the availability of atomics. */ +#if defined(__STDC__) && __STDC_VERSION__ >= 201112L && \ + !defined(__STDC_NO_ATOMICS__) + +#include + +/* Structure for once(), which must be initialized with ONCE_INIT. */ +struct once_s { + atomic_flag begun; + atomic_int done; +}; +#define ONCE_INIT {ATOMIC_FLAG_INIT, 0} + +/* + Run the provided init() function exactly once, even if multiple threads + invoke once() at the same time. The state must be a once_t initialized with + ONCE_INIT. + */ +local void once(once_t *state, void (*init)(void)) { + if (!atomic_load(&state->done)) { + if (atomic_flag_test_and_set(&state->begun)) + while (!atomic_load(&state->done)) + ; + else { + init(); + atomic_store(&state->done, 1); + } + } +} + +#else /* no atomics */ + +/* Structure for once(), which must be initialized with ONCE_INIT. */ +struct once_s { + volatile int begun; + volatile int done; +}; +#define ONCE_INIT {0, 0} + +/* Test and set. Alas, not atomic, but tries to minimize the period of + vulnerability. */ +local int test_and_set(int volatile *flag) { + int was; + + was = *flag; + *flag = 1; + return was; +} + +/* Run the provided init() function once. This is not thread-safe. */ +local void once(once_t *state, void (*init)(void)) { + if (!state->done) { + if (test_and_set(&state->begun)) + while (!state->done) + ; + else { + init(); + state->done = 1; + } + } +} + +#endif + +/* State for once(). */ +local once_t made = ONCE_INIT; + /* Generate tables for a byte-wise 32-bit CRC calculation on the polynomial: x^32+x^26+x^23+x^22+x^16+x^12+x^11+x^10+x^8+x^7+x^5+x^4+x^2+x+1. Polynomials over GF(2) are represented in binary, one bit per coefficient, - with the lowest powers in the most significant bit. Then adding polynomials + with the lowest powers in the most significant bit. Then adding polynomials is just exclusive-or, and multiplying a polynomial by x is a right shift by - one. If we call the above polynomial p, and represent a byte as the + one. If we call the above polynomial p, and represent a byte as the polynomial q, also with the lowest power in the most significant bit (so the - byte 0xb1 is the polynomial x^7+x^3+x+1), then the CRC is (q*x^32) mod p, + byte 0xb1 is the polynomial x^7+x^3+x^2+1), then the CRC is (q*x^32) mod p, where a mod b means the remainder after dividing a by b. This calculation is done using the shift-register method of multiplying and - taking the remainder. The register is initialized to zero, and for each + taking the remainder. The register is initialized to zero, and for each incoming bit, x^32 is added mod p to the register if the bit is a one (where - x^32 mod p is p+x^32 = x^26+...+1), and the register is multiplied mod p by - x (which is shifting right by one and adding x^32 mod p if the bit shifted - out is a one). We start with the highest power (least significant bit) of - q and repeat for all eight bits of q. - - The first table is simply the CRC of all possible eight bit values. This is - all the information needed to generate CRCs on data a byte at a time for all - combinations of CRC register values and incoming bytes. The remaining tables - allow for word-at-a-time CRC calculation for both big-endian and little- - endian machines, where a word is four bytes. -*/ -local void make_crc_table() -{ - z_crc_t c; - int n, k; - z_crc_t poly; /* polynomial exclusive-or pattern */ - /* terms of polynomial defining this crc (except x^32): */ - static volatile int first = 1; /* flag to limit concurrent making */ - static const unsigned char p[] = {0,1,2,4,5,7,8,10,11,12,16,22,23,26}; - - /* See if another task is already doing this (not thread-safe, but better - than nothing -- significantly reduces duration of vulnerability in - case the advice about DYNAMIC_CRC_TABLE is ignored) */ - if (first) { - first = 0; - - /* make exclusive-or pattern from polynomial (0xedb88320UL) */ - poly = 0; - for (n = 0; n < (int)(sizeof(p)/sizeof(unsigned char)); n++) - poly |= (z_crc_t)1 << (31 - p[n]); - - /* generate a crc for every 8-bit value */ - for (n = 0; n < 256; n++) { - c = (z_crc_t)n; - for (k = 0; k < 8; k++) - c = c & 1 ? poly ^ (c >> 1) : c >> 1; - crc_table[0][n] = c; - } + x^32 mod p is p+x^32 = x^26+...+1), and the register is multiplied mod p by x + (which is shifting right by one and adding x^32 mod p if the bit shifted out + is a one). We start with the highest power (least significant bit) of q and + repeat for all eight bits of q. -#ifdef BYFOUR - /* generate crc for each value followed by one, two, and three zeros, - and then the byte reversal of those as well as the first table */ - for (n = 0; n < 256; n++) { - c = crc_table[0][n]; - crc_table[4][n] = ZSWAP32(c); - for (k = 1; k < 4; k++) { - c = crc_table[0][c & 0xff] ^ (c >> 8); - crc_table[k][n] = c; - crc_table[k + 4][n] = ZSWAP32(c); - } - } -#endif /* BYFOUR */ + The table is simply the CRC of all possible eight bit values. This is all the + information needed to generate CRCs on data a byte at a time for all + combinations of CRC register values and incoming bytes. + */ - crc_table_empty = 0; - } - else { /* not first */ - /* wait for the other guy to finish (not efficient, but rare) */ - while (crc_table_empty) - ; +local void make_crc_table(void) { + unsigned i, j, n; + z_crc_t p; + + /* initialize the CRC of bytes tables */ + for (i = 0; i < 256; i++) { + p = i; + for (j = 0; j < 8; j++) + p = p & 1 ? (p >> 1) ^ POLY : p >> 1; + crc_table[i] = p; +#ifdef W + crc_big_table[i] = byte_swap(p); +#endif } + /* initialize the x^2^n mod p(x) table */ + p = (z_crc_t)1 << 30; /* x^1 */ + x2n_table[0] = p; + for (n = 1; n < 32; n++) + x2n_table[n] = p = multmodp(p, p); + +#ifdef W + /* initialize the braiding tables -- needs x2n_table[] */ + braid(crc_braid_table, crc_braid_big_table, N, W); +#endif + #ifdef MAKECRCH - /* write out CRC tables to crc32.h */ { + /* + The crc32.h header file contains tables for both 32-bit and 64-bit + z_word_t's, and so requires a 64-bit type be available. In that case, + z_word_t must be defined to be 64-bits. This code then also generates + and writes out the tables for the case that z_word_t is 32 bits. + */ +#if !defined(W) || W != 8 +# error Need a 64-bit integer type in order to generate crc32.h. +#endif FILE *out; + int k, n; + z_crc_t ltl[8][256]; + z_word_t big[8][256]; out = fopen("crc32.h", "w"); if (out == NULL) return; - fprintf(out, "/* crc32.h -- tables for rapid CRC calculation\n"); - fprintf(out, " * Generated automatically by crc32.c\n */\n\n"); - fprintf(out, "local const z_crc_t FAR "); - fprintf(out, "crc_table[TBLS][256] =\n{\n {\n"); - write_table(out, crc_table[0]); -# ifdef BYFOUR - fprintf(out, "#ifdef BYFOUR\n"); - for (k = 1; k < 8; k++) { - fprintf(out, " },\n {\n"); - write_table(out, crc_table[k]); + + /* write out little-endian CRC table to crc32.h */ + fprintf(out, + "/* crc32.h -- tables for rapid CRC calculation\n" + " * Generated automatically by crc32.c\n */\n" + "\n" + "local const z_crc_t FAR crc_table[] = {\n" + " "); + write_table(out, crc_table, 256); + fprintf(out, + "};\n"); + + /* write out big-endian CRC table for 64-bit z_word_t to crc32.h */ + fprintf(out, + "\n" + "#ifdef W\n" + "\n" + "#if W == 8\n" + "\n" + "local const z_word_t FAR crc_big_table[] = {\n" + " "); + write_table64(out, crc_big_table, 256); + fprintf(out, + "};\n"); + + /* write out big-endian CRC table for 32-bit z_word_t to crc32.h */ + fprintf(out, + "\n" + "#else /* W == 4 */\n" + "\n" + "local const z_word_t FAR crc_big_table[] = {\n" + " "); + write_table32hi(out, crc_big_table, 256); + fprintf(out, + "};\n" + "\n" + "#endif\n"); + + /* write out braid tables for each value of N */ + for (n = 1; n <= 6; n++) { + fprintf(out, + "\n" + "#if N == %d\n", n); + + /* compute braid tables for this N and 64-bit word_t */ + braid(ltl, big, n, 8); + + /* write out braid tables for 64-bit z_word_t to crc32.h */ + fprintf(out, + "\n" + "#if W == 8\n" + "\n" + "local const z_crc_t FAR crc_braid_table[][256] = {\n"); + for (k = 0; k < 8; k++) { + fprintf(out, " {"); + write_table(out, ltl[k], 256); + fprintf(out, "}%s", k < 7 ? ",\n" : ""); + } + fprintf(out, + "};\n" + "\n" + "local const z_word_t FAR crc_braid_big_table[][256] = {\n"); + for (k = 0; k < 8; k++) { + fprintf(out, " {"); + write_table64(out, big[k], 256); + fprintf(out, "}%s", k < 7 ? ",\n" : ""); + } + fprintf(out, + "};\n"); + + /* compute braid tables for this N and 32-bit word_t */ + braid(ltl, big, n, 4); + + /* write out braid tables for 32-bit z_word_t to crc32.h */ + fprintf(out, + "\n" + "#else /* W == 4 */\n" + "\n" + "local const z_crc_t FAR crc_braid_table[][256] = {\n"); + for (k = 0; k < 4; k++) { + fprintf(out, " {"); + write_table(out, ltl[k], 256); + fprintf(out, "}%s", k < 3 ? ",\n" : ""); + } + fprintf(out, + "};\n" + "\n" + "local const z_word_t FAR crc_braid_big_table[][256] = {\n"); + for (k = 0; k < 4; k++) { + fprintf(out, " {"); + write_table32hi(out, big[k], 256); + fprintf(out, "}%s", k < 3 ? ",\n" : ""); + } + fprintf(out, + "};\n" + "\n" + "#endif\n" + "\n" + "#endif\n"); } - fprintf(out, "#endif\n"); -# endif /* BYFOUR */ - fprintf(out, " }\n};\n"); + fprintf(out, + "\n" + "#endif\n"); + + /* write out zeros operator table to crc32.h */ + fprintf(out, + "\n" + "local const z_crc_t FAR x2n_table[] = {\n" + " "); + write_table(out, x2n_table, 32); + fprintf(out, + "};\n"); fclose(out); } #endif /* MAKECRCH */ } #ifdef MAKECRCH -local void write_table(out, table) - FILE *out; - const z_crc_t FAR *table; -{ + +/* + Write the 32-bit values in table[0..k-1] to out, five per line in + hexadecimal separated by commas. + */ +local void write_table(FILE *out, const z_crc_t FAR *table, int k) { int n; - for (n = 0; n < 256; n++) - fprintf(out, "%s0x%08lxUL%s", n % 5 ? "" : " ", + for (n = 0; n < k; n++) + fprintf(out, "%s0x%08lx%s", n == 0 || n % 5 ? "" : " ", (unsigned long)(table[n]), - n == 255 ? "\n" : (n % 5 == 4 ? ",\n" : ", ")); + n == k - 1 ? "" : (n % 5 == 4 ? ",\n" : ", ")); +} + +/* + Write the high 32-bits of each value in table[0..k-1] to out, five per line + in hexadecimal separated by commas. + */ +local void write_table32hi(FILE *out, const z_word_t FAR *table, int k) { + int n; + + for (n = 0; n < k; n++) + fprintf(out, "%s0x%08lx%s", n == 0 || n % 5 ? "" : " ", + (unsigned long)(table[n] >> 32), + n == k - 1 ? "" : (n % 5 == 4 ? ",\n" : ", ")); +} + +/* + Write the 64-bit values in table[0..k-1] to out, three per line in + hexadecimal separated by commas. This assumes that if there is a 64-bit + type, then there is also a long long integer type, and it is at least 64 + bits. If not, then the type cast and format string can be adjusted + accordingly. + */ +local void write_table64(FILE *out, const z_word_t FAR *table, int k) { + int n; + + for (n = 0; n < k; n++) + fprintf(out, "%s0x%016llx%s", n == 0 || n % 3 ? "" : " ", + (unsigned long long)(table[n]), + n == k - 1 ? "" : (n % 3 == 2 ? ",\n" : ", ")); +} + +/* Actually do the deed. */ +int main(void) { + make_crc_table(); + return 0; } + #endif /* MAKECRCH */ -#else /* !DYNAMIC_CRC_TABLE */ -/* ======================================================================== - * Tables of CRC-32s of all single-byte values, made by make_crc_table(). +#ifdef W +/* + Generate the little and big-endian braid tables for the given n and z_word_t + size w. Each array must have room for w blocks of 256 elements. */ -#include "crc32.h" +local void braid(z_crc_t ltl[][256], z_word_t big[][256], int n, int w) { + int k; + z_crc_t i, p, q; + for (k = 0; k < w; k++) { + p = x2nmodp((n * w + 3 - k) << 3, 0); + ltl[k][0] = 0; + big[w - 1 - k][0] = 0; + for (i = 1; i < 256; i++) { + ltl[k][i] = q = multmodp(i << 24, p); + big[w - 1 - k][i] = byte_swap(q); + } + } +} +#endif + #endif /* DYNAMIC_CRC_TABLE */ /* ========================================================================= - * This function can be used by asm versions of crc32() + * This function can be used by asm versions of crc32(), and to force the + * generation of the CRC tables in a threaded application. */ -const z_crc_t FAR * ZEXPORT get_crc_table() -{ +const z_crc_t FAR * ZEXPORT get_crc_table(void) { #ifdef DYNAMIC_CRC_TABLE - if (crc_table_empty) - make_crc_table(); + once(&made, make_crc_table); #endif /* DYNAMIC_CRC_TABLE */ return (const z_crc_t FAR *)crc_table; } -/* ========================================================================= */ -#define DO1 crc = crc_table[0][((int)crc ^ (*buf++)) & 0xff] ^ (crc >> 8) -#define DO8 DO1; DO1; DO1; DO1; DO1; DO1; DO1; DO1 +/* ========================================================================= + * Use ARM machine instructions if available. This will compute the CRC about + * ten times faster than the braided calculation. This code does not check for + * the presence of the CRC instruction at run time. __ARM_FEATURE_CRC32 will + * only be defined if the compilation specifies an ARM processor architecture + * that has the instructions. For example, compiling with -march=armv8.1-a or + * -march=armv8-a+crc, or -march=native if the compile machine has the crc32 + * instructions. + */ +#ifdef ARMCRC32 -/* ========================================================================= */ -unsigned long ZEXPORT crc32_z(crc, buf, len) - unsigned long crc; - const unsigned char FAR *buf; - z_size_t len; -{ - if (buf == Z_NULL) return 0UL; +/* + Constants empirically determined to maximize speed. These values are from + measurements on a Cortex-A57. Your mileage may vary. + */ +#define Z_BATCH 3990 /* number of words in a batch */ +#define Z_BATCH_ZEROS 0xa10d3d0c /* computed from Z_BATCH = 3990 */ +#define Z_BATCH_MIN 800 /* fewest words in a final batch */ + +unsigned long ZEXPORT crc32_z(unsigned long crc, const unsigned char FAR *buf, + z_size_t len) { + z_crc_t val; + z_word_t crc1, crc2; + const z_word_t *word; + z_word_t val0, val1, val2; + z_size_t last, last2, i; + z_size_t num; + + /* Return initial CRC, if requested. */ + if (buf == Z_NULL) return 0; #ifdef DYNAMIC_CRC_TABLE - if (crc_table_empty) - make_crc_table(); + once(&made, make_crc_table); #endif /* DYNAMIC_CRC_TABLE */ -#ifdef BYFOUR - if (sizeof(void *) == sizeof(ptrdiff_t)) { - z_crc_t endian; + /* Pre-condition the CRC */ + crc = (~crc) & 0xffffffff; - endian = 1; - if (*((unsigned char *)(&endian))) - return crc32_little(crc, buf, len); - else - return crc32_big(crc, buf, len); + /* Compute the CRC up to a word boundary. */ + while (len && ((z_size_t)buf & 7) != 0) { + len--; + val = *buf++; + __asm__ volatile("crc32b %w0, %w0, %w1" : "+r"(crc) : "r"(val)); } -#endif /* BYFOUR */ - crc = crc ^ 0xffffffffUL; - while (len >= 8) { - DO8; - len -= 8; + + /* Prepare to compute the CRC on full 64-bit words word[0..num-1]. */ + word = (z_word_t const *)buf; + num = len >> 3; + len &= 7; + + /* Do three interleaved CRCs to realize the throughput of one crc32x + instruction per cycle. Each CRC is calculated on Z_BATCH words. The + three CRCs are combined into a single CRC after each set of batches. */ + while (num >= 3 * Z_BATCH) { + crc1 = 0; + crc2 = 0; + for (i = 0; i < Z_BATCH; i++) { + val0 = word[i]; + val1 = word[i + Z_BATCH]; + val2 = word[i + 2 * Z_BATCH]; + __asm__ volatile("crc32x %w0, %w0, %x1" : "+r"(crc) : "r"(val0)); + __asm__ volatile("crc32x %w0, %w0, %x1" : "+r"(crc1) : "r"(val1)); + __asm__ volatile("crc32x %w0, %w0, %x1" : "+r"(crc2) : "r"(val2)); + } + word += 3 * Z_BATCH; + num -= 3 * Z_BATCH; + crc = multmodp(Z_BATCH_ZEROS, crc) ^ crc1; + crc = multmodp(Z_BATCH_ZEROS, crc) ^ crc2; } - if (len) do { - DO1; - } while (--len); - return crc ^ 0xffffffffUL; -} -/* ========================================================================= */ -unsigned long ZEXPORT crc32(crc, buf, len) - unsigned long crc; - const unsigned char FAR *buf; - uInt len; -{ - return crc32_z(crc, buf, len); + /* Do one last smaller batch with the remaining words, if there are enough + to pay for the combination of CRCs. */ + last = num / 3; + if (last >= Z_BATCH_MIN) { + last2 = last << 1; + crc1 = 0; + crc2 = 0; + for (i = 0; i < last; i++) { + val0 = word[i]; + val1 = word[i + last]; + val2 = word[i + last2]; + __asm__ volatile("crc32x %w0, %w0, %x1" : "+r"(crc) : "r"(val0)); + __asm__ volatile("crc32x %w0, %w0, %x1" : "+r"(crc1) : "r"(val1)); + __asm__ volatile("crc32x %w0, %w0, %x1" : "+r"(crc2) : "r"(val2)); + } + word += 3 * last; + num -= 3 * last; + val = x2nmodp(last, 6); + crc = multmodp(val, crc) ^ crc1; + crc = multmodp(val, crc) ^ crc2; + } + + /* Compute the CRC on any remaining words. */ + for (i = 0; i < num; i++) { + val0 = word[i]; + __asm__ volatile("crc32x %w0, %w0, %x1" : "+r"(crc) : "r"(val0)); + } + word += num; + + /* Complete the CRC on any remaining bytes. */ + buf = (const unsigned char FAR *)word; + while (len) { + len--; + val = *buf++; + __asm__ volatile("crc32b %w0, %w0, %w1" : "+r"(crc) : "r"(val)); + } + + /* Return the CRC, post-conditioned. */ + return crc ^ 0xffffffff; } -#ifdef BYFOUR +#else + +#ifdef W /* - This BYFOUR code accesses the passed unsigned char * buffer with a 32-bit - integer pointer type. This violates the strict aliasing rule, where a - compiler can assume, for optimization purposes, that two pointers to - fundamentally different types won't ever point to the same memory. This can - manifest as a problem only if one of the pointers is written to. This code - only reads from those pointers. So long as this code remains isolated in - this compilation unit, there won't be a problem. For this reason, this code - should not be copied and pasted into a compilation unit in which other code - writes to the buffer that is passed to these routines. + Return the CRC of the W bytes in the word_t data, taking the + least-significant byte of the word as the first byte of data, without any pre + or post conditioning. This is used to combine the CRCs of each braid. */ +local z_crc_t crc_word(z_word_t data) { + int k; + for (k = 0; k < W; k++) + data = (data >> 8) ^ crc_table[data & 0xff]; + return (z_crc_t)data; +} -/* ========================================================================= */ -#define DOLIT4 c ^= *buf4++; \ - c = crc_table[3][c & 0xff] ^ crc_table[2][(c >> 8) & 0xff] ^ \ - crc_table[1][(c >> 16) & 0xff] ^ crc_table[0][c >> 24] -#define DOLIT32 DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4 +local z_word_t crc_word_big(z_word_t data) { + int k; + for (k = 0; k < W; k++) + data = (data << 8) ^ + crc_big_table[(data >> ((W - 1) << 3)) & 0xff]; + return data; +} + +#endif /* ========================================================================= */ -local unsigned long crc32_little(crc, buf, len) - unsigned long crc; - const unsigned char FAR *buf; - z_size_t len; -{ - register z_crc_t c; - register const z_crc_t FAR *buf4; - - c = (z_crc_t)crc; - c = ~c; - while (len && ((ptrdiff_t)buf & 3)) { - c = crc_table[0][(c ^ *buf++) & 0xff] ^ (c >> 8); - len--; - } +unsigned long ZEXPORT crc32_z(unsigned long crc, const unsigned char FAR *buf, + z_size_t len) { + /* Return initial CRC, if requested. */ + if (buf == Z_NULL) return 0; - buf4 = (const z_crc_t FAR *)(const void FAR *)buf; - while (len >= 32) { - DOLIT32; - len -= 32; - } - while (len >= 4) { - DOLIT4; - len -= 4; - } - buf = (const unsigned char FAR *)buf4; +#ifdef DYNAMIC_CRC_TABLE + once(&made, make_crc_table); +#endif /* DYNAMIC_CRC_TABLE */ - if (len) do { - c = crc_table[0][(c ^ *buf++) & 0xff] ^ (c >> 8); - } while (--len); - c = ~c; - return (unsigned long)c; -} + /* Pre-condition the CRC */ + crc = (~crc) & 0xffffffff; -/* ========================================================================= */ -#define DOBIG4 c ^= *buf4++; \ - c = crc_table[4][c & 0xff] ^ crc_table[5][(c >> 8) & 0xff] ^ \ - crc_table[6][(c >> 16) & 0xff] ^ crc_table[7][c >> 24] -#define DOBIG32 DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4 +#ifdef W -/* ========================================================================= */ -local unsigned long crc32_big(crc, buf, len) - unsigned long crc; - const unsigned char FAR *buf; - z_size_t len; -{ - register z_crc_t c; - register const z_crc_t FAR *buf4; - - c = ZSWAP32((z_crc_t)crc); - c = ~c; - while (len && ((ptrdiff_t)buf & 3)) { - c = crc_table[4][(c >> 24) ^ *buf++] ^ (c << 8); - len--; + /* If provided enough bytes, do a braided CRC calculation. */ + if (len >= N * W + W - 1) { + z_size_t blks; + z_word_t const *words; + unsigned endian; + int k; + + /* Compute the CRC up to a z_word_t boundary. */ + while (len && ((z_size_t)buf & (W - 1)) != 0) { + len--; + crc = (crc >> 8) ^ crc_table[(crc ^ *buf++) & 0xff]; + } + + /* Compute the CRC on as many N z_word_t blocks as are available. */ + blks = len / (N * W); + len -= blks * N * W; + words = (z_word_t const *)buf; + + /* Do endian check at execution time instead of compile time, since ARM + processors can change the endianness at execution time. If the + compiler knows what the endianness will be, it can optimize out the + check and the unused branch. */ + endian = 1; + if (*(unsigned char *)&endian) { + /* Little endian. */ + + z_crc_t crc0; + z_word_t word0; +#if N > 1 + z_crc_t crc1; + z_word_t word1; +#if N > 2 + z_crc_t crc2; + z_word_t word2; +#if N > 3 + z_crc_t crc3; + z_word_t word3; +#if N > 4 + z_crc_t crc4; + z_word_t word4; +#if N > 5 + z_crc_t crc5; + z_word_t word5; +#endif +#endif +#endif +#endif +#endif + + /* Initialize the CRC for each braid. */ + crc0 = crc; +#if N > 1 + crc1 = 0; +#if N > 2 + crc2 = 0; +#if N > 3 + crc3 = 0; +#if N > 4 + crc4 = 0; +#if N > 5 + crc5 = 0; +#endif +#endif +#endif +#endif +#endif + + /* + Process the first blks-1 blocks, computing the CRCs on each braid + independently. + */ + while (--blks) { + /* Load the word for each braid into registers. */ + word0 = crc0 ^ words[0]; +#if N > 1 + word1 = crc1 ^ words[1]; +#if N > 2 + word2 = crc2 ^ words[2]; +#if N > 3 + word3 = crc3 ^ words[3]; +#if N > 4 + word4 = crc4 ^ words[4]; +#if N > 5 + word5 = crc5 ^ words[5]; +#endif +#endif +#endif +#endif +#endif + words += N; + + /* Compute and update the CRC for each word. The loop should + get unrolled. */ + crc0 = crc_braid_table[0][word0 & 0xff]; +#if N > 1 + crc1 = crc_braid_table[0][word1 & 0xff]; +#if N > 2 + crc2 = crc_braid_table[0][word2 & 0xff]; +#if N > 3 + crc3 = crc_braid_table[0][word3 & 0xff]; +#if N > 4 + crc4 = crc_braid_table[0][word4 & 0xff]; +#if N > 5 + crc5 = crc_braid_table[0][word5 & 0xff]; +#endif +#endif +#endif +#endif +#endif + for (k = 1; k < W; k++) { + crc0 ^= crc_braid_table[k][(word0 >> (k << 3)) & 0xff]; +#if N > 1 + crc1 ^= crc_braid_table[k][(word1 >> (k << 3)) & 0xff]; +#if N > 2 + crc2 ^= crc_braid_table[k][(word2 >> (k << 3)) & 0xff]; +#if N > 3 + crc3 ^= crc_braid_table[k][(word3 >> (k << 3)) & 0xff]; +#if N > 4 + crc4 ^= crc_braid_table[k][(word4 >> (k << 3)) & 0xff]; +#if N > 5 + crc5 ^= crc_braid_table[k][(word5 >> (k << 3)) & 0xff]; +#endif +#endif +#endif +#endif +#endif + } + } + + /* + Process the last block, combining the CRCs of the N braids at the + same time. + */ + crc = crc_word(crc0 ^ words[0]); +#if N > 1 + crc = crc_word(crc1 ^ words[1] ^ crc); +#if N > 2 + crc = crc_word(crc2 ^ words[2] ^ crc); +#if N > 3 + crc = crc_word(crc3 ^ words[3] ^ crc); +#if N > 4 + crc = crc_word(crc4 ^ words[4] ^ crc); +#if N > 5 + crc = crc_word(crc5 ^ words[5] ^ crc); +#endif +#endif +#endif +#endif +#endif + words += N; + } + else { + /* Big endian. */ + + z_word_t crc0, word0, comb; +#if N > 1 + z_word_t crc1, word1; +#if N > 2 + z_word_t crc2, word2; +#if N > 3 + z_word_t crc3, word3; +#if N > 4 + z_word_t crc4, word4; +#if N > 5 + z_word_t crc5, word5; +#endif +#endif +#endif +#endif +#endif + + /* Initialize the CRC for each braid. */ + crc0 = byte_swap(crc); +#if N > 1 + crc1 = 0; +#if N > 2 + crc2 = 0; +#if N > 3 + crc3 = 0; +#if N > 4 + crc4 = 0; +#if N > 5 + crc5 = 0; +#endif +#endif +#endif +#endif +#endif + + /* + Process the first blks-1 blocks, computing the CRCs on each braid + independently. + */ + while (--blks) { + /* Load the word for each braid into registers. */ + word0 = crc0 ^ words[0]; +#if N > 1 + word1 = crc1 ^ words[1]; +#if N > 2 + word2 = crc2 ^ words[2]; +#if N > 3 + word3 = crc3 ^ words[3]; +#if N > 4 + word4 = crc4 ^ words[4]; +#if N > 5 + word5 = crc5 ^ words[5]; +#endif +#endif +#endif +#endif +#endif + words += N; + + /* Compute and update the CRC for each word. The loop should + get unrolled. */ + crc0 = crc_braid_big_table[0][word0 & 0xff]; +#if N > 1 + crc1 = crc_braid_big_table[0][word1 & 0xff]; +#if N > 2 + crc2 = crc_braid_big_table[0][word2 & 0xff]; +#if N > 3 + crc3 = crc_braid_big_table[0][word3 & 0xff]; +#if N > 4 + crc4 = crc_braid_big_table[0][word4 & 0xff]; +#if N > 5 + crc5 = crc_braid_big_table[0][word5 & 0xff]; +#endif +#endif +#endif +#endif +#endif + for (k = 1; k < W; k++) { + crc0 ^= crc_braid_big_table[k][(word0 >> (k << 3)) & 0xff]; +#if N > 1 + crc1 ^= crc_braid_big_table[k][(word1 >> (k << 3)) & 0xff]; +#if N > 2 + crc2 ^= crc_braid_big_table[k][(word2 >> (k << 3)) & 0xff]; +#if N > 3 + crc3 ^= crc_braid_big_table[k][(word3 >> (k << 3)) & 0xff]; +#if N > 4 + crc4 ^= crc_braid_big_table[k][(word4 >> (k << 3)) & 0xff]; +#if N > 5 + crc5 ^= crc_braid_big_table[k][(word5 >> (k << 3)) & 0xff]; +#endif +#endif +#endif +#endif +#endif + } + } + + /* + Process the last block, combining the CRCs of the N braids at the + same time. + */ + comb = crc_word_big(crc0 ^ words[0]); +#if N > 1 + comb = crc_word_big(crc1 ^ words[1] ^ comb); +#if N > 2 + comb = crc_word_big(crc2 ^ words[2] ^ comb); +#if N > 3 + comb = crc_word_big(crc3 ^ words[3] ^ comb); +#if N > 4 + comb = crc_word_big(crc4 ^ words[4] ^ comb); +#if N > 5 + comb = crc_word_big(crc5 ^ words[5] ^ comb); +#endif +#endif +#endif +#endif +#endif + words += N; + crc = byte_swap(comb); + } + + /* + Update the pointer to the remaining bytes to process. + */ + buf = (unsigned char const *)words; } - buf4 = (const z_crc_t FAR *)(const void FAR *)buf; - while (len >= 32) { - DOBIG32; - len -= 32; +#endif /* W */ + + /* Complete the computation of the CRC on any remaining bytes. */ + while (len >= 8) { + len -= 8; + crc = (crc >> 8) ^ crc_table[(crc ^ *buf++) & 0xff]; + crc = (crc >> 8) ^ crc_table[(crc ^ *buf++) & 0xff]; + crc = (crc >> 8) ^ crc_table[(crc ^ *buf++) & 0xff]; + crc = (crc >> 8) ^ crc_table[(crc ^ *buf++) & 0xff]; + crc = (crc >> 8) ^ crc_table[(crc ^ *buf++) & 0xff]; + crc = (crc >> 8) ^ crc_table[(crc ^ *buf++) & 0xff]; + crc = (crc >> 8) ^ crc_table[(crc ^ *buf++) & 0xff]; + crc = (crc >> 8) ^ crc_table[(crc ^ *buf++) & 0xff]; } - while (len >= 4) { - DOBIG4; - len -= 4; + while (len) { + len--; + crc = (crc >> 8) ^ crc_table[(crc ^ *buf++) & 0xff]; } - buf = (const unsigned char FAR *)buf4; - if (len) do { - c = crc_table[4][(c >> 24) ^ *buf++] ^ (c << 8); - } while (--len); - c = ~c; - return (unsigned long)(ZSWAP32(c)); + /* Return the CRC, post-conditioned. */ + return crc ^ 0xffffffff; } -#endif /* BYFOUR */ - -#define GF2_DIM 32 /* dimension of GF(2) vectors (length of CRC) */ +#endif /* ========================================================================= */ -local unsigned long gf2_matrix_times(mat, vec) - unsigned long *mat; - unsigned long vec; -{ - unsigned long sum; - - sum = 0; - while (vec) { - if (vec & 1) - sum ^= *mat; - vec >>= 1; - mat++; - } - return sum; +unsigned long ZEXPORT crc32(unsigned long crc, const unsigned char FAR *buf, + uInt len) { + return crc32_z(crc, buf, len); } /* ========================================================================= */ -local void gf2_matrix_square(square, mat) - unsigned long *square; - unsigned long *mat; -{ - int n; - - for (n = 0; n < GF2_DIM; n++) - square[n] = gf2_matrix_times(mat, mat[n]); +uLong ZEXPORT crc32_combine64(uLong crc1, uLong crc2, z_off64_t len2) { +#ifdef DYNAMIC_CRC_TABLE + once(&made, make_crc_table); +#endif /* DYNAMIC_CRC_TABLE */ + return multmodp(x2nmodp(len2, 3), crc1) ^ (crc2 & 0xffffffff); } /* ========================================================================= */ -local uLong crc32_combine_(crc1, crc2, len2) - uLong crc1; - uLong crc2; - z_off64_t len2; -{ - int n; - unsigned long row; - unsigned long even[GF2_DIM]; /* even-power-of-two zeros operator */ - unsigned long odd[GF2_DIM]; /* odd-power-of-two zeros operator */ - - /* degenerate case (also disallow negative lengths) */ - if (len2 <= 0) - return crc1; - - /* put operator for one zero bit in odd */ - odd[0] = 0xedb88320UL; /* CRC-32 polynomial */ - row = 1; - for (n = 1; n < GF2_DIM; n++) { - odd[n] = row; - row <<= 1; - } +uLong ZEXPORT crc32_combine(uLong crc1, uLong crc2, z_off_t len2) { + return crc32_combine64(crc1, crc2, (z_off64_t)len2); +} - /* put operator for two zero bits in even */ - gf2_matrix_square(even, odd); - - /* put operator for four zero bits in odd */ - gf2_matrix_square(odd, even); - - /* apply len2 zeros to crc1 (first square will put the operator for one - zero byte, eight zero bits, in even) */ - do { - /* apply zeros operator for this bit of len2 */ - gf2_matrix_square(even, odd); - if (len2 & 1) - crc1 = gf2_matrix_times(even, crc1); - len2 >>= 1; - - /* if no more bits set, then done */ - if (len2 == 0) - break; - - /* another iteration of the loop with odd and even swapped */ - gf2_matrix_square(odd, even); - if (len2 & 1) - crc1 = gf2_matrix_times(odd, crc1); - len2 >>= 1; - - /* if no more bits set, then done */ - } while (len2 != 0); - - /* return combined crc */ - crc1 ^= crc2; - return crc1; +/* ========================================================================= */ +uLong ZEXPORT crc32_combine_gen64(z_off64_t len2) { +#ifdef DYNAMIC_CRC_TABLE + once(&made, make_crc_table); +#endif /* DYNAMIC_CRC_TABLE */ + return x2nmodp(len2, 3); } /* ========================================================================= */ -uLong ZEXPORT crc32_combine(crc1, crc2, len2) - uLong crc1; - uLong crc2; - z_off_t len2; -{ - return crc32_combine_(crc1, crc2, len2); +uLong ZEXPORT crc32_combine_gen(z_off_t len2) { + return crc32_combine_gen64((z_off64_t)len2); } -uLong ZEXPORT crc32_combine64(crc1, crc2, len2) - uLong crc1; - uLong crc2; - z_off64_t len2; -{ - return crc32_combine_(crc1, crc2, len2); +/* ========================================================================= */ +uLong ZEXPORT crc32_combine_op(uLong crc1, uLong crc2, uLong op) { + return multmodp(op, crc1) ^ (crc2 & 0xffffffff); } diff --git a/zlib/crc32.h b/zlib/crc32.h index 9e0c77810251..137df68d616c 100644 --- a/zlib/crc32.h +++ b/zlib/crc32.h @@ -2,440 +2,9445 @@ * Generated automatically by crc32.c */ -local const z_crc_t FAR crc_table[TBLS][256] = -{ - { - 0x00000000UL, 0x77073096UL, 0xee0e612cUL, 0x990951baUL, 0x076dc419UL, - 0x706af48fUL, 0xe963a535UL, 0x9e6495a3UL, 0x0edb8832UL, 0x79dcb8a4UL, - 0xe0d5e91eUL, 0x97d2d988UL, 0x09b64c2bUL, 0x7eb17cbdUL, 0xe7b82d07UL, - 0x90bf1d91UL, 0x1db71064UL, 0x6ab020f2UL, 0xf3b97148UL, 0x84be41deUL, - 0x1adad47dUL, 0x6ddde4ebUL, 0xf4d4b551UL, 0x83d385c7UL, 0x136c9856UL, - 0x646ba8c0UL, 0xfd62f97aUL, 0x8a65c9ecUL, 0x14015c4fUL, 0x63066cd9UL, - 0xfa0f3d63UL, 0x8d080df5UL, 0x3b6e20c8UL, 0x4c69105eUL, 0xd56041e4UL, - 0xa2677172UL, 0x3c03e4d1UL, 0x4b04d447UL, 0xd20d85fdUL, 0xa50ab56bUL, - 0x35b5a8faUL, 0x42b2986cUL, 0xdbbbc9d6UL, 0xacbcf940UL, 0x32d86ce3UL, - 0x45df5c75UL, 0xdcd60dcfUL, 0xabd13d59UL, 0x26d930acUL, 0x51de003aUL, - 0xc8d75180UL, 0xbfd06116UL, 0x21b4f4b5UL, 0x56b3c423UL, 0xcfba9599UL, - 0xb8bda50fUL, 0x2802b89eUL, 0x5f058808UL, 0xc60cd9b2UL, 0xb10be924UL, - 0x2f6f7c87UL, 0x58684c11UL, 0xc1611dabUL, 0xb6662d3dUL, 0x76dc4190UL, - 0x01db7106UL, 0x98d220bcUL, 0xefd5102aUL, 0x71b18589UL, 0x06b6b51fUL, - 0x9fbfe4a5UL, 0xe8b8d433UL, 0x7807c9a2UL, 0x0f00f934UL, 0x9609a88eUL, - 0xe10e9818UL, 0x7f6a0dbbUL, 0x086d3d2dUL, 0x91646c97UL, 0xe6635c01UL, - 0x6b6b51f4UL, 0x1c6c6162UL, 0x856530d8UL, 0xf262004eUL, 0x6c0695edUL, - 0x1b01a57bUL, 0x8208f4c1UL, 0xf50fc457UL, 0x65b0d9c6UL, 0x12b7e950UL, - 0x8bbeb8eaUL, 0xfcb9887cUL, 0x62dd1ddfUL, 0x15da2d49UL, 0x8cd37cf3UL, - 0xfbd44c65UL, 0x4db26158UL, 0x3ab551ceUL, 0xa3bc0074UL, 0xd4bb30e2UL, - 0x4adfa541UL, 0x3dd895d7UL, 0xa4d1c46dUL, 0xd3d6f4fbUL, 0x4369e96aUL, - 0x346ed9fcUL, 0xad678846UL, 0xda60b8d0UL, 0x44042d73UL, 0x33031de5UL, - 0xaa0a4c5fUL, 0xdd0d7cc9UL, 0x5005713cUL, 0x270241aaUL, 0xbe0b1010UL, - 0xc90c2086UL, 0x5768b525UL, 0x206f85b3UL, 0xb966d409UL, 0xce61e49fUL, - 0x5edef90eUL, 0x29d9c998UL, 0xb0d09822UL, 0xc7d7a8b4UL, 0x59b33d17UL, - 0x2eb40d81UL, 0xb7bd5c3bUL, 0xc0ba6cadUL, 0xedb88320UL, 0x9abfb3b6UL, - 0x03b6e20cUL, 0x74b1d29aUL, 0xead54739UL, 0x9dd277afUL, 0x04db2615UL, - 0x73dc1683UL, 0xe3630b12UL, 0x94643b84UL, 0x0d6d6a3eUL, 0x7a6a5aa8UL, - 0xe40ecf0bUL, 0x9309ff9dUL, 0x0a00ae27UL, 0x7d079eb1UL, 0xf00f9344UL, - 0x8708a3d2UL, 0x1e01f268UL, 0x6906c2feUL, 0xf762575dUL, 0x806567cbUL, - 0x196c3671UL, 0x6e6b06e7UL, 0xfed41b76UL, 0x89d32be0UL, 0x10da7a5aUL, - 0x67dd4accUL, 0xf9b9df6fUL, 0x8ebeeff9UL, 0x17b7be43UL, 0x60b08ed5UL, - 0xd6d6a3e8UL, 0xa1d1937eUL, 0x38d8c2c4UL, 0x4fdff252UL, 0xd1bb67f1UL, - 0xa6bc5767UL, 0x3fb506ddUL, 0x48b2364bUL, 0xd80d2bdaUL, 0xaf0a1b4cUL, - 0x36034af6UL, 0x41047a60UL, 0xdf60efc3UL, 0xa867df55UL, 0x316e8eefUL, - 0x4669be79UL, 0xcb61b38cUL, 0xbc66831aUL, 0x256fd2a0UL, 0x5268e236UL, - 0xcc0c7795UL, 0xbb0b4703UL, 0x220216b9UL, 0x5505262fUL, 0xc5ba3bbeUL, - 0xb2bd0b28UL, 0x2bb45a92UL, 0x5cb36a04UL, 0xc2d7ffa7UL, 0xb5d0cf31UL, - 0x2cd99e8bUL, 0x5bdeae1dUL, 0x9b64c2b0UL, 0xec63f226UL, 0x756aa39cUL, - 0x026d930aUL, 0x9c0906a9UL, 0xeb0e363fUL, 0x72076785UL, 0x05005713UL, - 0x95bf4a82UL, 0xe2b87a14UL, 0x7bb12baeUL, 0x0cb61b38UL, 0x92d28e9bUL, - 0xe5d5be0dUL, 0x7cdcefb7UL, 0x0bdbdf21UL, 0x86d3d2d4UL, 0xf1d4e242UL, - 0x68ddb3f8UL, 0x1fda836eUL, 0x81be16cdUL, 0xf6b9265bUL, 0x6fb077e1UL, - 0x18b74777UL, 0x88085ae6UL, 0xff0f6a70UL, 0x66063bcaUL, 0x11010b5cUL, - 0x8f659effUL, 0xf862ae69UL, 0x616bffd3UL, 0x166ccf45UL, 0xa00ae278UL, - 0xd70dd2eeUL, 0x4e048354UL, 0x3903b3c2UL, 0xa7672661UL, 0xd06016f7UL, - 0x4969474dUL, 0x3e6e77dbUL, 0xaed16a4aUL, 0xd9d65adcUL, 0x40df0b66UL, - 0x37d83bf0UL, 0xa9bcae53UL, 0xdebb9ec5UL, 0x47b2cf7fUL, 0x30b5ffe9UL, - 0xbdbdf21cUL, 0xcabac28aUL, 0x53b39330UL, 0x24b4a3a6UL, 0xbad03605UL, - 0xcdd70693UL, 0x54de5729UL, 0x23d967bfUL, 0xb3667a2eUL, 0xc4614ab8UL, - 0x5d681b02UL, 0x2a6f2b94UL, 0xb40bbe37UL, 0xc30c8ea1UL, 0x5a05df1bUL, - 0x2d02ef8dUL -#ifdef BYFOUR - }, - { - 0x00000000UL, 0x191b3141UL, 0x32366282UL, 0x2b2d53c3UL, 0x646cc504UL, - 0x7d77f445UL, 0x565aa786UL, 0x4f4196c7UL, 0xc8d98a08UL, 0xd1c2bb49UL, - 0xfaefe88aUL, 0xe3f4d9cbUL, 0xacb54f0cUL, 0xb5ae7e4dUL, 0x9e832d8eUL, - 0x87981ccfUL, 0x4ac21251UL, 0x53d92310UL, 0x78f470d3UL, 0x61ef4192UL, - 0x2eaed755UL, 0x37b5e614UL, 0x1c98b5d7UL, 0x05838496UL, 0x821b9859UL, - 0x9b00a918UL, 0xb02dfadbUL, 0xa936cb9aUL, 0xe6775d5dUL, 0xff6c6c1cUL, - 0xd4413fdfUL, 0xcd5a0e9eUL, 0x958424a2UL, 0x8c9f15e3UL, 0xa7b24620UL, - 0xbea97761UL, 0xf1e8e1a6UL, 0xe8f3d0e7UL, 0xc3de8324UL, 0xdac5b265UL, - 0x5d5daeaaUL, 0x44469febUL, 0x6f6bcc28UL, 0x7670fd69UL, 0x39316baeUL, - 0x202a5aefUL, 0x0b07092cUL, 0x121c386dUL, 0xdf4636f3UL, 0xc65d07b2UL, - 0xed705471UL, 0xf46b6530UL, 0xbb2af3f7UL, 0xa231c2b6UL, 0x891c9175UL, - 0x9007a034UL, 0x179fbcfbUL, 0x0e848dbaUL, 0x25a9de79UL, 0x3cb2ef38UL, - 0x73f379ffUL, 0x6ae848beUL, 0x41c51b7dUL, 0x58de2a3cUL, 0xf0794f05UL, - 0xe9627e44UL, 0xc24f2d87UL, 0xdb541cc6UL, 0x94158a01UL, 0x8d0ebb40UL, - 0xa623e883UL, 0xbf38d9c2UL, 0x38a0c50dUL, 0x21bbf44cUL, 0x0a96a78fUL, - 0x138d96ceUL, 0x5ccc0009UL, 0x45d73148UL, 0x6efa628bUL, 0x77e153caUL, - 0xbabb5d54UL, 0xa3a06c15UL, 0x888d3fd6UL, 0x91960e97UL, 0xded79850UL, - 0xc7cca911UL, 0xece1fad2UL, 0xf5facb93UL, 0x7262d75cUL, 0x6b79e61dUL, - 0x4054b5deUL, 0x594f849fUL, 0x160e1258UL, 0x0f152319UL, 0x243870daUL, - 0x3d23419bUL, 0x65fd6ba7UL, 0x7ce65ae6UL, 0x57cb0925UL, 0x4ed03864UL, - 0x0191aea3UL, 0x188a9fe2UL, 0x33a7cc21UL, 0x2abcfd60UL, 0xad24e1afUL, - 0xb43fd0eeUL, 0x9f12832dUL, 0x8609b26cUL, 0xc94824abUL, 0xd05315eaUL, - 0xfb7e4629UL, 0xe2657768UL, 0x2f3f79f6UL, 0x362448b7UL, 0x1d091b74UL, - 0x04122a35UL, 0x4b53bcf2UL, 0x52488db3UL, 0x7965de70UL, 0x607eef31UL, - 0xe7e6f3feUL, 0xfefdc2bfUL, 0xd5d0917cUL, 0xcccba03dUL, 0x838a36faUL, - 0x9a9107bbUL, 0xb1bc5478UL, 0xa8a76539UL, 0x3b83984bUL, 0x2298a90aUL, - 0x09b5fac9UL, 0x10aecb88UL, 0x5fef5d4fUL, 0x46f46c0eUL, 0x6dd93fcdUL, - 0x74c20e8cUL, 0xf35a1243UL, 0xea412302UL, 0xc16c70c1UL, 0xd8774180UL, - 0x9736d747UL, 0x8e2de606UL, 0xa500b5c5UL, 0xbc1b8484UL, 0x71418a1aUL, - 0x685abb5bUL, 0x4377e898UL, 0x5a6cd9d9UL, 0x152d4f1eUL, 0x0c367e5fUL, - 0x271b2d9cUL, 0x3e001cddUL, 0xb9980012UL, 0xa0833153UL, 0x8bae6290UL, - 0x92b553d1UL, 0xddf4c516UL, 0xc4eff457UL, 0xefc2a794UL, 0xf6d996d5UL, - 0xae07bce9UL, 0xb71c8da8UL, 0x9c31de6bUL, 0x852aef2aUL, 0xca6b79edUL, - 0xd37048acUL, 0xf85d1b6fUL, 0xe1462a2eUL, 0x66de36e1UL, 0x7fc507a0UL, - 0x54e85463UL, 0x4df36522UL, 0x02b2f3e5UL, 0x1ba9c2a4UL, 0x30849167UL, - 0x299fa026UL, 0xe4c5aeb8UL, 0xfdde9ff9UL, 0xd6f3cc3aUL, 0xcfe8fd7bUL, - 0x80a96bbcUL, 0x99b25afdUL, 0xb29f093eUL, 0xab84387fUL, 0x2c1c24b0UL, - 0x350715f1UL, 0x1e2a4632UL, 0x07317773UL, 0x4870e1b4UL, 0x516bd0f5UL, - 0x7a468336UL, 0x635db277UL, 0xcbfad74eUL, 0xd2e1e60fUL, 0xf9ccb5ccUL, - 0xe0d7848dUL, 0xaf96124aUL, 0xb68d230bUL, 0x9da070c8UL, 0x84bb4189UL, - 0x03235d46UL, 0x1a386c07UL, 0x31153fc4UL, 0x280e0e85UL, 0x674f9842UL, - 0x7e54a903UL, 0x5579fac0UL, 0x4c62cb81UL, 0x8138c51fUL, 0x9823f45eUL, - 0xb30ea79dUL, 0xaa1596dcUL, 0xe554001bUL, 0xfc4f315aUL, 0xd7626299UL, - 0xce7953d8UL, 0x49e14f17UL, 0x50fa7e56UL, 0x7bd72d95UL, 0x62cc1cd4UL, - 0x2d8d8a13UL, 0x3496bb52UL, 0x1fbbe891UL, 0x06a0d9d0UL, 0x5e7ef3ecUL, - 0x4765c2adUL, 0x6c48916eUL, 0x7553a02fUL, 0x3a1236e8UL, 0x230907a9UL, - 0x0824546aUL, 0x113f652bUL, 0x96a779e4UL, 0x8fbc48a5UL, 0xa4911b66UL, - 0xbd8a2a27UL, 0xf2cbbce0UL, 0xebd08da1UL, 0xc0fdde62UL, 0xd9e6ef23UL, - 0x14bce1bdUL, 0x0da7d0fcUL, 0x268a833fUL, 0x3f91b27eUL, 0x70d024b9UL, - 0x69cb15f8UL, 0x42e6463bUL, 0x5bfd777aUL, 0xdc656bb5UL, 0xc57e5af4UL, - 0xee530937UL, 0xf7483876UL, 0xb809aeb1UL, 0xa1129ff0UL, 0x8a3fcc33UL, - 0x9324fd72UL - }, - { - 0x00000000UL, 0x01c26a37UL, 0x0384d46eUL, 0x0246be59UL, 0x0709a8dcUL, - 0x06cbc2ebUL, 0x048d7cb2UL, 0x054f1685UL, 0x0e1351b8UL, 0x0fd13b8fUL, - 0x0d9785d6UL, 0x0c55efe1UL, 0x091af964UL, 0x08d89353UL, 0x0a9e2d0aUL, - 0x0b5c473dUL, 0x1c26a370UL, 0x1de4c947UL, 0x1fa2771eUL, 0x1e601d29UL, - 0x1b2f0bacUL, 0x1aed619bUL, 0x18abdfc2UL, 0x1969b5f5UL, 0x1235f2c8UL, - 0x13f798ffUL, 0x11b126a6UL, 0x10734c91UL, 0x153c5a14UL, 0x14fe3023UL, - 0x16b88e7aUL, 0x177ae44dUL, 0x384d46e0UL, 0x398f2cd7UL, 0x3bc9928eUL, - 0x3a0bf8b9UL, 0x3f44ee3cUL, 0x3e86840bUL, 0x3cc03a52UL, 0x3d025065UL, - 0x365e1758UL, 0x379c7d6fUL, 0x35dac336UL, 0x3418a901UL, 0x3157bf84UL, - 0x3095d5b3UL, 0x32d36beaUL, 0x331101ddUL, 0x246be590UL, 0x25a98fa7UL, - 0x27ef31feUL, 0x262d5bc9UL, 0x23624d4cUL, 0x22a0277bUL, 0x20e69922UL, - 0x2124f315UL, 0x2a78b428UL, 0x2bbade1fUL, 0x29fc6046UL, 0x283e0a71UL, - 0x2d711cf4UL, 0x2cb376c3UL, 0x2ef5c89aUL, 0x2f37a2adUL, 0x709a8dc0UL, - 0x7158e7f7UL, 0x731e59aeUL, 0x72dc3399UL, 0x7793251cUL, 0x76514f2bUL, - 0x7417f172UL, 0x75d59b45UL, 0x7e89dc78UL, 0x7f4bb64fUL, 0x7d0d0816UL, - 0x7ccf6221UL, 0x798074a4UL, 0x78421e93UL, 0x7a04a0caUL, 0x7bc6cafdUL, - 0x6cbc2eb0UL, 0x6d7e4487UL, 0x6f38fadeUL, 0x6efa90e9UL, 0x6bb5866cUL, - 0x6a77ec5bUL, 0x68315202UL, 0x69f33835UL, 0x62af7f08UL, 0x636d153fUL, - 0x612bab66UL, 0x60e9c151UL, 0x65a6d7d4UL, 0x6464bde3UL, 0x662203baUL, - 0x67e0698dUL, 0x48d7cb20UL, 0x4915a117UL, 0x4b531f4eUL, 0x4a917579UL, - 0x4fde63fcUL, 0x4e1c09cbUL, 0x4c5ab792UL, 0x4d98dda5UL, 0x46c49a98UL, - 0x4706f0afUL, 0x45404ef6UL, 0x448224c1UL, 0x41cd3244UL, 0x400f5873UL, - 0x4249e62aUL, 0x438b8c1dUL, 0x54f16850UL, 0x55330267UL, 0x5775bc3eUL, - 0x56b7d609UL, 0x53f8c08cUL, 0x523aaabbUL, 0x507c14e2UL, 0x51be7ed5UL, - 0x5ae239e8UL, 0x5b2053dfUL, 0x5966ed86UL, 0x58a487b1UL, 0x5deb9134UL, - 0x5c29fb03UL, 0x5e6f455aUL, 0x5fad2f6dUL, 0xe1351b80UL, 0xe0f771b7UL, - 0xe2b1cfeeUL, 0xe373a5d9UL, 0xe63cb35cUL, 0xe7fed96bUL, 0xe5b86732UL, - 0xe47a0d05UL, 0xef264a38UL, 0xeee4200fUL, 0xeca29e56UL, 0xed60f461UL, - 0xe82fe2e4UL, 0xe9ed88d3UL, 0xebab368aUL, 0xea695cbdUL, 0xfd13b8f0UL, - 0xfcd1d2c7UL, 0xfe976c9eUL, 0xff5506a9UL, 0xfa1a102cUL, 0xfbd87a1bUL, - 0xf99ec442UL, 0xf85cae75UL, 0xf300e948UL, 0xf2c2837fUL, 0xf0843d26UL, - 0xf1465711UL, 0xf4094194UL, 0xf5cb2ba3UL, 0xf78d95faUL, 0xf64fffcdUL, - 0xd9785d60UL, 0xd8ba3757UL, 0xdafc890eUL, 0xdb3ee339UL, 0xde71f5bcUL, - 0xdfb39f8bUL, 0xddf521d2UL, 0xdc374be5UL, 0xd76b0cd8UL, 0xd6a966efUL, - 0xd4efd8b6UL, 0xd52db281UL, 0xd062a404UL, 0xd1a0ce33UL, 0xd3e6706aUL, - 0xd2241a5dUL, 0xc55efe10UL, 0xc49c9427UL, 0xc6da2a7eUL, 0xc7184049UL, - 0xc25756ccUL, 0xc3953cfbUL, 0xc1d382a2UL, 0xc011e895UL, 0xcb4dafa8UL, - 0xca8fc59fUL, 0xc8c97bc6UL, 0xc90b11f1UL, 0xcc440774UL, 0xcd866d43UL, - 0xcfc0d31aUL, 0xce02b92dUL, 0x91af9640UL, 0x906dfc77UL, 0x922b422eUL, - 0x93e92819UL, 0x96a63e9cUL, 0x976454abUL, 0x9522eaf2UL, 0x94e080c5UL, - 0x9fbcc7f8UL, 0x9e7eadcfUL, 0x9c381396UL, 0x9dfa79a1UL, 0x98b56f24UL, - 0x99770513UL, 0x9b31bb4aUL, 0x9af3d17dUL, 0x8d893530UL, 0x8c4b5f07UL, - 0x8e0de15eUL, 0x8fcf8b69UL, 0x8a809decUL, 0x8b42f7dbUL, 0x89044982UL, - 0x88c623b5UL, 0x839a6488UL, 0x82580ebfUL, 0x801eb0e6UL, 0x81dcdad1UL, - 0x8493cc54UL, 0x8551a663UL, 0x8717183aUL, 0x86d5720dUL, 0xa9e2d0a0UL, - 0xa820ba97UL, 0xaa6604ceUL, 0xaba46ef9UL, 0xaeeb787cUL, 0xaf29124bUL, - 0xad6fac12UL, 0xacadc625UL, 0xa7f18118UL, 0xa633eb2fUL, 0xa4755576UL, - 0xa5b73f41UL, 0xa0f829c4UL, 0xa13a43f3UL, 0xa37cfdaaUL, 0xa2be979dUL, - 0xb5c473d0UL, 0xb40619e7UL, 0xb640a7beUL, 0xb782cd89UL, 0xb2cddb0cUL, - 0xb30fb13bUL, 0xb1490f62UL, 0xb08b6555UL, 0xbbd72268UL, 0xba15485fUL, - 0xb853f606UL, 0xb9919c31UL, 0xbcde8ab4UL, 0xbd1ce083UL, 0xbf5a5edaUL, - 0xbe9834edUL - }, - { - 0x00000000UL, 0xb8bc6765UL, 0xaa09c88bUL, 0x12b5afeeUL, 0x8f629757UL, - 0x37def032UL, 0x256b5fdcUL, 0x9dd738b9UL, 0xc5b428efUL, 0x7d084f8aUL, - 0x6fbde064UL, 0xd7018701UL, 0x4ad6bfb8UL, 0xf26ad8ddUL, 0xe0df7733UL, - 0x58631056UL, 0x5019579fUL, 0xe8a530faUL, 0xfa109f14UL, 0x42acf871UL, - 0xdf7bc0c8UL, 0x67c7a7adUL, 0x75720843UL, 0xcdce6f26UL, 0x95ad7f70UL, - 0x2d111815UL, 0x3fa4b7fbUL, 0x8718d09eUL, 0x1acfe827UL, 0xa2738f42UL, - 0xb0c620acUL, 0x087a47c9UL, 0xa032af3eUL, 0x188ec85bUL, 0x0a3b67b5UL, - 0xb28700d0UL, 0x2f503869UL, 0x97ec5f0cUL, 0x8559f0e2UL, 0x3de59787UL, - 0x658687d1UL, 0xdd3ae0b4UL, 0xcf8f4f5aUL, 0x7733283fUL, 0xeae41086UL, - 0x525877e3UL, 0x40edd80dUL, 0xf851bf68UL, 0xf02bf8a1UL, 0x48979fc4UL, - 0x5a22302aUL, 0xe29e574fUL, 0x7f496ff6UL, 0xc7f50893UL, 0xd540a77dUL, - 0x6dfcc018UL, 0x359fd04eUL, 0x8d23b72bUL, 0x9f9618c5UL, 0x272a7fa0UL, - 0xbafd4719UL, 0x0241207cUL, 0x10f48f92UL, 0xa848e8f7UL, 0x9b14583dUL, - 0x23a83f58UL, 0x311d90b6UL, 0x89a1f7d3UL, 0x1476cf6aUL, 0xaccaa80fUL, - 0xbe7f07e1UL, 0x06c36084UL, 0x5ea070d2UL, 0xe61c17b7UL, 0xf4a9b859UL, - 0x4c15df3cUL, 0xd1c2e785UL, 0x697e80e0UL, 0x7bcb2f0eUL, 0xc377486bUL, - 0xcb0d0fa2UL, 0x73b168c7UL, 0x6104c729UL, 0xd9b8a04cUL, 0x446f98f5UL, - 0xfcd3ff90UL, 0xee66507eUL, 0x56da371bUL, 0x0eb9274dUL, 0xb6054028UL, - 0xa4b0efc6UL, 0x1c0c88a3UL, 0x81dbb01aUL, 0x3967d77fUL, 0x2bd27891UL, - 0x936e1ff4UL, 0x3b26f703UL, 0x839a9066UL, 0x912f3f88UL, 0x299358edUL, - 0xb4446054UL, 0x0cf80731UL, 0x1e4da8dfUL, 0xa6f1cfbaUL, 0xfe92dfecUL, - 0x462eb889UL, 0x549b1767UL, 0xec277002UL, 0x71f048bbUL, 0xc94c2fdeUL, - 0xdbf98030UL, 0x6345e755UL, 0x6b3fa09cUL, 0xd383c7f9UL, 0xc1366817UL, - 0x798a0f72UL, 0xe45d37cbUL, 0x5ce150aeUL, 0x4e54ff40UL, 0xf6e89825UL, - 0xae8b8873UL, 0x1637ef16UL, 0x048240f8UL, 0xbc3e279dUL, 0x21e91f24UL, - 0x99557841UL, 0x8be0d7afUL, 0x335cb0caUL, 0xed59b63bUL, 0x55e5d15eUL, - 0x47507eb0UL, 0xffec19d5UL, 0x623b216cUL, 0xda874609UL, 0xc832e9e7UL, - 0x708e8e82UL, 0x28ed9ed4UL, 0x9051f9b1UL, 0x82e4565fUL, 0x3a58313aUL, - 0xa78f0983UL, 0x1f336ee6UL, 0x0d86c108UL, 0xb53aa66dUL, 0xbd40e1a4UL, - 0x05fc86c1UL, 0x1749292fUL, 0xaff54e4aUL, 0x322276f3UL, 0x8a9e1196UL, - 0x982bbe78UL, 0x2097d91dUL, 0x78f4c94bUL, 0xc048ae2eUL, 0xd2fd01c0UL, - 0x6a4166a5UL, 0xf7965e1cUL, 0x4f2a3979UL, 0x5d9f9697UL, 0xe523f1f2UL, - 0x4d6b1905UL, 0xf5d77e60UL, 0xe762d18eUL, 0x5fdeb6ebUL, 0xc2098e52UL, - 0x7ab5e937UL, 0x680046d9UL, 0xd0bc21bcUL, 0x88df31eaUL, 0x3063568fUL, - 0x22d6f961UL, 0x9a6a9e04UL, 0x07bda6bdUL, 0xbf01c1d8UL, 0xadb46e36UL, - 0x15080953UL, 0x1d724e9aUL, 0xa5ce29ffUL, 0xb77b8611UL, 0x0fc7e174UL, - 0x9210d9cdUL, 0x2aacbea8UL, 0x38191146UL, 0x80a57623UL, 0xd8c66675UL, - 0x607a0110UL, 0x72cfaefeUL, 0xca73c99bUL, 0x57a4f122UL, 0xef189647UL, - 0xfdad39a9UL, 0x45115eccUL, 0x764dee06UL, 0xcef18963UL, 0xdc44268dUL, - 0x64f841e8UL, 0xf92f7951UL, 0x41931e34UL, 0x5326b1daUL, 0xeb9ad6bfUL, - 0xb3f9c6e9UL, 0x0b45a18cUL, 0x19f00e62UL, 0xa14c6907UL, 0x3c9b51beUL, - 0x842736dbUL, 0x96929935UL, 0x2e2efe50UL, 0x2654b999UL, 0x9ee8defcUL, - 0x8c5d7112UL, 0x34e11677UL, 0xa9362eceUL, 0x118a49abUL, 0x033fe645UL, - 0xbb838120UL, 0xe3e09176UL, 0x5b5cf613UL, 0x49e959fdUL, 0xf1553e98UL, - 0x6c820621UL, 0xd43e6144UL, 0xc68bceaaUL, 0x7e37a9cfUL, 0xd67f4138UL, - 0x6ec3265dUL, 0x7c7689b3UL, 0xc4caeed6UL, 0x591dd66fUL, 0xe1a1b10aUL, - 0xf3141ee4UL, 0x4ba87981UL, 0x13cb69d7UL, 0xab770eb2UL, 0xb9c2a15cUL, - 0x017ec639UL, 0x9ca9fe80UL, 0x241599e5UL, 0x36a0360bUL, 0x8e1c516eUL, - 0x866616a7UL, 0x3eda71c2UL, 0x2c6fde2cUL, 0x94d3b949UL, 0x090481f0UL, - 0xb1b8e695UL, 0xa30d497bUL, 0x1bb12e1eUL, 0x43d23e48UL, 0xfb6e592dUL, - 0xe9dbf6c3UL, 0x516791a6UL, 0xccb0a91fUL, 0x740cce7aUL, 0x66b96194UL, - 0xde0506f1UL - }, - { - 0x00000000UL, 0x96300777UL, 0x2c610eeeUL, 0xba510999UL, 0x19c46d07UL, - 0x8ff46a70UL, 0x35a563e9UL, 0xa395649eUL, 0x3288db0eUL, 0xa4b8dc79UL, - 0x1ee9d5e0UL, 0x88d9d297UL, 0x2b4cb609UL, 0xbd7cb17eUL, 0x072db8e7UL, - 0x911dbf90UL, 0x6410b71dUL, 0xf220b06aUL, 0x4871b9f3UL, 0xde41be84UL, - 0x7dd4da1aUL, 0xebe4dd6dUL, 0x51b5d4f4UL, 0xc785d383UL, 0x56986c13UL, - 0xc0a86b64UL, 0x7af962fdUL, 0xecc9658aUL, 0x4f5c0114UL, 0xd96c0663UL, - 0x633d0ffaUL, 0xf50d088dUL, 0xc8206e3bUL, 0x5e10694cUL, 0xe44160d5UL, - 0x727167a2UL, 0xd1e4033cUL, 0x47d4044bUL, 0xfd850dd2UL, 0x6bb50aa5UL, - 0xfaa8b535UL, 0x6c98b242UL, 0xd6c9bbdbUL, 0x40f9bcacUL, 0xe36cd832UL, - 0x755cdf45UL, 0xcf0dd6dcUL, 0x593dd1abUL, 0xac30d926UL, 0x3a00de51UL, - 0x8051d7c8UL, 0x1661d0bfUL, 0xb5f4b421UL, 0x23c4b356UL, 0x9995bacfUL, - 0x0fa5bdb8UL, 0x9eb80228UL, 0x0888055fUL, 0xb2d90cc6UL, 0x24e90bb1UL, - 0x877c6f2fUL, 0x114c6858UL, 0xab1d61c1UL, 0x3d2d66b6UL, 0x9041dc76UL, - 0x0671db01UL, 0xbc20d298UL, 0x2a10d5efUL, 0x8985b171UL, 0x1fb5b606UL, - 0xa5e4bf9fUL, 0x33d4b8e8UL, 0xa2c90778UL, 0x34f9000fUL, 0x8ea80996UL, - 0x18980ee1UL, 0xbb0d6a7fUL, 0x2d3d6d08UL, 0x976c6491UL, 0x015c63e6UL, - 0xf4516b6bUL, 0x62616c1cUL, 0xd8306585UL, 0x4e0062f2UL, 0xed95066cUL, - 0x7ba5011bUL, 0xc1f40882UL, 0x57c40ff5UL, 0xc6d9b065UL, 0x50e9b712UL, - 0xeab8be8bUL, 0x7c88b9fcUL, 0xdf1ddd62UL, 0x492dda15UL, 0xf37cd38cUL, - 0x654cd4fbUL, 0x5861b24dUL, 0xce51b53aUL, 0x7400bca3UL, 0xe230bbd4UL, - 0x41a5df4aUL, 0xd795d83dUL, 0x6dc4d1a4UL, 0xfbf4d6d3UL, 0x6ae96943UL, - 0xfcd96e34UL, 0x468867adUL, 0xd0b860daUL, 0x732d0444UL, 0xe51d0333UL, - 0x5f4c0aaaUL, 0xc97c0dddUL, 0x3c710550UL, 0xaa410227UL, 0x10100bbeUL, - 0x86200cc9UL, 0x25b56857UL, 0xb3856f20UL, 0x09d466b9UL, 0x9fe461ceUL, - 0x0ef9de5eUL, 0x98c9d929UL, 0x2298d0b0UL, 0xb4a8d7c7UL, 0x173db359UL, - 0x810db42eUL, 0x3b5cbdb7UL, 0xad6cbac0UL, 0x2083b8edUL, 0xb6b3bf9aUL, - 0x0ce2b603UL, 0x9ad2b174UL, 0x3947d5eaUL, 0xaf77d29dUL, 0x1526db04UL, - 0x8316dc73UL, 0x120b63e3UL, 0x843b6494UL, 0x3e6a6d0dUL, 0xa85a6a7aUL, - 0x0bcf0ee4UL, 0x9dff0993UL, 0x27ae000aUL, 0xb19e077dUL, 0x44930ff0UL, - 0xd2a30887UL, 0x68f2011eUL, 0xfec20669UL, 0x5d5762f7UL, 0xcb676580UL, - 0x71366c19UL, 0xe7066b6eUL, 0x761bd4feUL, 0xe02bd389UL, 0x5a7ada10UL, - 0xcc4add67UL, 0x6fdfb9f9UL, 0xf9efbe8eUL, 0x43beb717UL, 0xd58eb060UL, - 0xe8a3d6d6UL, 0x7e93d1a1UL, 0xc4c2d838UL, 0x52f2df4fUL, 0xf167bbd1UL, - 0x6757bca6UL, 0xdd06b53fUL, 0x4b36b248UL, 0xda2b0dd8UL, 0x4c1b0aafUL, - 0xf64a0336UL, 0x607a0441UL, 0xc3ef60dfUL, 0x55df67a8UL, 0xef8e6e31UL, - 0x79be6946UL, 0x8cb361cbUL, 0x1a8366bcUL, 0xa0d26f25UL, 0x36e26852UL, - 0x95770cccUL, 0x03470bbbUL, 0xb9160222UL, 0x2f260555UL, 0xbe3bbac5UL, - 0x280bbdb2UL, 0x925ab42bUL, 0x046ab35cUL, 0xa7ffd7c2UL, 0x31cfd0b5UL, - 0x8b9ed92cUL, 0x1daede5bUL, 0xb0c2649bUL, 0x26f263ecUL, 0x9ca36a75UL, - 0x0a936d02UL, 0xa906099cUL, 0x3f360eebUL, 0x85670772UL, 0x13570005UL, - 0x824abf95UL, 0x147ab8e2UL, 0xae2bb17bUL, 0x381bb60cUL, 0x9b8ed292UL, - 0x0dbed5e5UL, 0xb7efdc7cUL, 0x21dfdb0bUL, 0xd4d2d386UL, 0x42e2d4f1UL, - 0xf8b3dd68UL, 0x6e83da1fUL, 0xcd16be81UL, 0x5b26b9f6UL, 0xe177b06fUL, - 0x7747b718UL, 0xe65a0888UL, 0x706a0fffUL, 0xca3b0666UL, 0x5c0b0111UL, - 0xff9e658fUL, 0x69ae62f8UL, 0xd3ff6b61UL, 0x45cf6c16UL, 0x78e20aa0UL, - 0xeed20dd7UL, 0x5483044eUL, 0xc2b30339UL, 0x612667a7UL, 0xf71660d0UL, - 0x4d476949UL, 0xdb776e3eUL, 0x4a6ad1aeUL, 0xdc5ad6d9UL, 0x660bdf40UL, - 0xf03bd837UL, 0x53aebca9UL, 0xc59ebbdeUL, 0x7fcfb247UL, 0xe9ffb530UL, - 0x1cf2bdbdUL, 0x8ac2bacaUL, 0x3093b353UL, 0xa6a3b424UL, 0x0536d0baUL, - 0x9306d7cdUL, 0x2957de54UL, 0xbf67d923UL, 0x2e7a66b3UL, 0xb84a61c4UL, - 0x021b685dUL, 0x942b6f2aUL, 0x37be0bb4UL, 0xa18e0cc3UL, 0x1bdf055aUL, - 0x8def022dUL - }, - { - 0x00000000UL, 0x41311b19UL, 0x82623632UL, 0xc3532d2bUL, 0x04c56c64UL, - 0x45f4777dUL, 0x86a75a56UL, 0xc796414fUL, 0x088ad9c8UL, 0x49bbc2d1UL, - 0x8ae8effaUL, 0xcbd9f4e3UL, 0x0c4fb5acUL, 0x4d7eaeb5UL, 0x8e2d839eUL, - 0xcf1c9887UL, 0x5112c24aUL, 0x1023d953UL, 0xd370f478UL, 0x9241ef61UL, - 0x55d7ae2eUL, 0x14e6b537UL, 0xd7b5981cUL, 0x96848305UL, 0x59981b82UL, - 0x18a9009bUL, 0xdbfa2db0UL, 0x9acb36a9UL, 0x5d5d77e6UL, 0x1c6c6cffUL, - 0xdf3f41d4UL, 0x9e0e5acdUL, 0xa2248495UL, 0xe3159f8cUL, 0x2046b2a7UL, - 0x6177a9beUL, 0xa6e1e8f1UL, 0xe7d0f3e8UL, 0x2483dec3UL, 0x65b2c5daUL, - 0xaaae5d5dUL, 0xeb9f4644UL, 0x28cc6b6fUL, 0x69fd7076UL, 0xae6b3139UL, - 0xef5a2a20UL, 0x2c09070bUL, 0x6d381c12UL, 0xf33646dfUL, 0xb2075dc6UL, - 0x715470edUL, 0x30656bf4UL, 0xf7f32abbUL, 0xb6c231a2UL, 0x75911c89UL, - 0x34a00790UL, 0xfbbc9f17UL, 0xba8d840eUL, 0x79dea925UL, 0x38efb23cUL, - 0xff79f373UL, 0xbe48e86aUL, 0x7d1bc541UL, 0x3c2ade58UL, 0x054f79f0UL, - 0x447e62e9UL, 0x872d4fc2UL, 0xc61c54dbUL, 0x018a1594UL, 0x40bb0e8dUL, - 0x83e823a6UL, 0xc2d938bfUL, 0x0dc5a038UL, 0x4cf4bb21UL, 0x8fa7960aUL, - 0xce968d13UL, 0x0900cc5cUL, 0x4831d745UL, 0x8b62fa6eUL, 0xca53e177UL, - 0x545dbbbaUL, 0x156ca0a3UL, 0xd63f8d88UL, 0x970e9691UL, 0x5098d7deUL, - 0x11a9ccc7UL, 0xd2fae1ecUL, 0x93cbfaf5UL, 0x5cd76272UL, 0x1de6796bUL, - 0xdeb55440UL, 0x9f844f59UL, 0x58120e16UL, 0x1923150fUL, 0xda703824UL, - 0x9b41233dUL, 0xa76bfd65UL, 0xe65ae67cUL, 0x2509cb57UL, 0x6438d04eUL, - 0xa3ae9101UL, 0xe29f8a18UL, 0x21cca733UL, 0x60fdbc2aUL, 0xafe124adUL, - 0xeed03fb4UL, 0x2d83129fUL, 0x6cb20986UL, 0xab2448c9UL, 0xea1553d0UL, - 0x29467efbUL, 0x687765e2UL, 0xf6793f2fUL, 0xb7482436UL, 0x741b091dUL, - 0x352a1204UL, 0xf2bc534bUL, 0xb38d4852UL, 0x70de6579UL, 0x31ef7e60UL, - 0xfef3e6e7UL, 0xbfc2fdfeUL, 0x7c91d0d5UL, 0x3da0cbccUL, 0xfa368a83UL, - 0xbb07919aUL, 0x7854bcb1UL, 0x3965a7a8UL, 0x4b98833bUL, 0x0aa99822UL, - 0xc9fab509UL, 0x88cbae10UL, 0x4f5def5fUL, 0x0e6cf446UL, 0xcd3fd96dUL, - 0x8c0ec274UL, 0x43125af3UL, 0x022341eaUL, 0xc1706cc1UL, 0x804177d8UL, - 0x47d73697UL, 0x06e62d8eUL, 0xc5b500a5UL, 0x84841bbcUL, 0x1a8a4171UL, - 0x5bbb5a68UL, 0x98e87743UL, 0xd9d96c5aUL, 0x1e4f2d15UL, 0x5f7e360cUL, - 0x9c2d1b27UL, 0xdd1c003eUL, 0x120098b9UL, 0x533183a0UL, 0x9062ae8bUL, - 0xd153b592UL, 0x16c5f4ddUL, 0x57f4efc4UL, 0x94a7c2efUL, 0xd596d9f6UL, - 0xe9bc07aeUL, 0xa88d1cb7UL, 0x6bde319cUL, 0x2aef2a85UL, 0xed796bcaUL, - 0xac4870d3UL, 0x6f1b5df8UL, 0x2e2a46e1UL, 0xe136de66UL, 0xa007c57fUL, - 0x6354e854UL, 0x2265f34dUL, 0xe5f3b202UL, 0xa4c2a91bUL, 0x67918430UL, - 0x26a09f29UL, 0xb8aec5e4UL, 0xf99fdefdUL, 0x3accf3d6UL, 0x7bfde8cfUL, - 0xbc6ba980UL, 0xfd5ab299UL, 0x3e099fb2UL, 0x7f3884abUL, 0xb0241c2cUL, - 0xf1150735UL, 0x32462a1eUL, 0x73773107UL, 0xb4e17048UL, 0xf5d06b51UL, - 0x3683467aUL, 0x77b25d63UL, 0x4ed7facbUL, 0x0fe6e1d2UL, 0xccb5ccf9UL, - 0x8d84d7e0UL, 0x4a1296afUL, 0x0b238db6UL, 0xc870a09dUL, 0x8941bb84UL, - 0x465d2303UL, 0x076c381aUL, 0xc43f1531UL, 0x850e0e28UL, 0x42984f67UL, - 0x03a9547eUL, 0xc0fa7955UL, 0x81cb624cUL, 0x1fc53881UL, 0x5ef42398UL, - 0x9da70eb3UL, 0xdc9615aaUL, 0x1b0054e5UL, 0x5a314ffcUL, 0x996262d7UL, - 0xd85379ceUL, 0x174fe149UL, 0x567efa50UL, 0x952dd77bUL, 0xd41ccc62UL, - 0x138a8d2dUL, 0x52bb9634UL, 0x91e8bb1fUL, 0xd0d9a006UL, 0xecf37e5eUL, - 0xadc26547UL, 0x6e91486cUL, 0x2fa05375UL, 0xe836123aUL, 0xa9070923UL, - 0x6a542408UL, 0x2b653f11UL, 0xe479a796UL, 0xa548bc8fUL, 0x661b91a4UL, - 0x272a8abdUL, 0xe0bccbf2UL, 0xa18dd0ebUL, 0x62defdc0UL, 0x23efe6d9UL, - 0xbde1bc14UL, 0xfcd0a70dUL, 0x3f838a26UL, 0x7eb2913fUL, 0xb924d070UL, - 0xf815cb69UL, 0x3b46e642UL, 0x7a77fd5bUL, 0xb56b65dcUL, 0xf45a7ec5UL, - 0x370953eeUL, 0x763848f7UL, 0xb1ae09b8UL, 0xf09f12a1UL, 0x33cc3f8aUL, - 0x72fd2493UL - }, - { - 0x00000000UL, 0x376ac201UL, 0x6ed48403UL, 0x59be4602UL, 0xdca80907UL, - 0xebc2cb06UL, 0xb27c8d04UL, 0x85164f05UL, 0xb851130eUL, 0x8f3bd10fUL, - 0xd685970dUL, 0xe1ef550cUL, 0x64f91a09UL, 0x5393d808UL, 0x0a2d9e0aUL, - 0x3d475c0bUL, 0x70a3261cUL, 0x47c9e41dUL, 0x1e77a21fUL, 0x291d601eUL, - 0xac0b2f1bUL, 0x9b61ed1aUL, 0xc2dfab18UL, 0xf5b56919UL, 0xc8f23512UL, - 0xff98f713UL, 0xa626b111UL, 0x914c7310UL, 0x145a3c15UL, 0x2330fe14UL, - 0x7a8eb816UL, 0x4de47a17UL, 0xe0464d38UL, 0xd72c8f39UL, 0x8e92c93bUL, - 0xb9f80b3aUL, 0x3cee443fUL, 0x0b84863eUL, 0x523ac03cUL, 0x6550023dUL, - 0x58175e36UL, 0x6f7d9c37UL, 0x36c3da35UL, 0x01a91834UL, 0x84bf5731UL, - 0xb3d59530UL, 0xea6bd332UL, 0xdd011133UL, 0x90e56b24UL, 0xa78fa925UL, - 0xfe31ef27UL, 0xc95b2d26UL, 0x4c4d6223UL, 0x7b27a022UL, 0x2299e620UL, - 0x15f32421UL, 0x28b4782aUL, 0x1fdeba2bUL, 0x4660fc29UL, 0x710a3e28UL, - 0xf41c712dUL, 0xc376b32cUL, 0x9ac8f52eUL, 0xada2372fUL, 0xc08d9a70UL, - 0xf7e75871UL, 0xae591e73UL, 0x9933dc72UL, 0x1c259377UL, 0x2b4f5176UL, - 0x72f11774UL, 0x459bd575UL, 0x78dc897eUL, 0x4fb64b7fUL, 0x16080d7dUL, - 0x2162cf7cUL, 0xa4748079UL, 0x931e4278UL, 0xcaa0047aUL, 0xfdcac67bUL, - 0xb02ebc6cUL, 0x87447e6dUL, 0xdefa386fUL, 0xe990fa6eUL, 0x6c86b56bUL, - 0x5bec776aUL, 0x02523168UL, 0x3538f369UL, 0x087faf62UL, 0x3f156d63UL, - 0x66ab2b61UL, 0x51c1e960UL, 0xd4d7a665UL, 0xe3bd6464UL, 0xba032266UL, - 0x8d69e067UL, 0x20cbd748UL, 0x17a11549UL, 0x4e1f534bUL, 0x7975914aUL, - 0xfc63de4fUL, 0xcb091c4eUL, 0x92b75a4cUL, 0xa5dd984dUL, 0x989ac446UL, - 0xaff00647UL, 0xf64e4045UL, 0xc1248244UL, 0x4432cd41UL, 0x73580f40UL, - 0x2ae64942UL, 0x1d8c8b43UL, 0x5068f154UL, 0x67023355UL, 0x3ebc7557UL, - 0x09d6b756UL, 0x8cc0f853UL, 0xbbaa3a52UL, 0xe2147c50UL, 0xd57ebe51UL, - 0xe839e25aUL, 0xdf53205bUL, 0x86ed6659UL, 0xb187a458UL, 0x3491eb5dUL, - 0x03fb295cUL, 0x5a456f5eUL, 0x6d2fad5fUL, 0x801b35e1UL, 0xb771f7e0UL, - 0xeecfb1e2UL, 0xd9a573e3UL, 0x5cb33ce6UL, 0x6bd9fee7UL, 0x3267b8e5UL, - 0x050d7ae4UL, 0x384a26efUL, 0x0f20e4eeUL, 0x569ea2ecUL, 0x61f460edUL, - 0xe4e22fe8UL, 0xd388ede9UL, 0x8a36abebUL, 0xbd5c69eaUL, 0xf0b813fdUL, - 0xc7d2d1fcUL, 0x9e6c97feUL, 0xa90655ffUL, 0x2c101afaUL, 0x1b7ad8fbUL, - 0x42c49ef9UL, 0x75ae5cf8UL, 0x48e900f3UL, 0x7f83c2f2UL, 0x263d84f0UL, - 0x115746f1UL, 0x944109f4UL, 0xa32bcbf5UL, 0xfa958df7UL, 0xcdff4ff6UL, - 0x605d78d9UL, 0x5737bad8UL, 0x0e89fcdaUL, 0x39e33edbUL, 0xbcf571deUL, - 0x8b9fb3dfUL, 0xd221f5ddUL, 0xe54b37dcUL, 0xd80c6bd7UL, 0xef66a9d6UL, - 0xb6d8efd4UL, 0x81b22dd5UL, 0x04a462d0UL, 0x33cea0d1UL, 0x6a70e6d3UL, - 0x5d1a24d2UL, 0x10fe5ec5UL, 0x27949cc4UL, 0x7e2adac6UL, 0x494018c7UL, - 0xcc5657c2UL, 0xfb3c95c3UL, 0xa282d3c1UL, 0x95e811c0UL, 0xa8af4dcbUL, - 0x9fc58fcaUL, 0xc67bc9c8UL, 0xf1110bc9UL, 0x740744ccUL, 0x436d86cdUL, - 0x1ad3c0cfUL, 0x2db902ceUL, 0x4096af91UL, 0x77fc6d90UL, 0x2e422b92UL, - 0x1928e993UL, 0x9c3ea696UL, 0xab546497UL, 0xf2ea2295UL, 0xc580e094UL, - 0xf8c7bc9fUL, 0xcfad7e9eUL, 0x9613389cUL, 0xa179fa9dUL, 0x246fb598UL, - 0x13057799UL, 0x4abb319bUL, 0x7dd1f39aUL, 0x3035898dUL, 0x075f4b8cUL, - 0x5ee10d8eUL, 0x698bcf8fUL, 0xec9d808aUL, 0xdbf7428bUL, 0x82490489UL, - 0xb523c688UL, 0x88649a83UL, 0xbf0e5882UL, 0xe6b01e80UL, 0xd1dadc81UL, - 0x54cc9384UL, 0x63a65185UL, 0x3a181787UL, 0x0d72d586UL, 0xa0d0e2a9UL, - 0x97ba20a8UL, 0xce0466aaUL, 0xf96ea4abUL, 0x7c78ebaeUL, 0x4b1229afUL, - 0x12ac6fadUL, 0x25c6adacUL, 0x1881f1a7UL, 0x2feb33a6UL, 0x765575a4UL, - 0x413fb7a5UL, 0xc429f8a0UL, 0xf3433aa1UL, 0xaafd7ca3UL, 0x9d97bea2UL, - 0xd073c4b5UL, 0xe71906b4UL, 0xbea740b6UL, 0x89cd82b7UL, 0x0cdbcdb2UL, - 0x3bb10fb3UL, 0x620f49b1UL, 0x55658bb0UL, 0x6822d7bbUL, 0x5f4815baUL, - 0x06f653b8UL, 0x319c91b9UL, 0xb48adebcUL, 0x83e01cbdUL, 0xda5e5abfUL, - 0xed3498beUL - }, - { - 0x00000000UL, 0x6567bcb8UL, 0x8bc809aaUL, 0xeeafb512UL, 0x5797628fUL, - 0x32f0de37UL, 0xdc5f6b25UL, 0xb938d79dUL, 0xef28b4c5UL, 0x8a4f087dUL, - 0x64e0bd6fUL, 0x018701d7UL, 0xb8bfd64aUL, 0xddd86af2UL, 0x3377dfe0UL, - 0x56106358UL, 0x9f571950UL, 0xfa30a5e8UL, 0x149f10faUL, 0x71f8ac42UL, - 0xc8c07bdfUL, 0xada7c767UL, 0x43087275UL, 0x266fcecdUL, 0x707fad95UL, - 0x1518112dUL, 0xfbb7a43fUL, 0x9ed01887UL, 0x27e8cf1aUL, 0x428f73a2UL, - 0xac20c6b0UL, 0xc9477a08UL, 0x3eaf32a0UL, 0x5bc88e18UL, 0xb5673b0aUL, - 0xd00087b2UL, 0x6938502fUL, 0x0c5fec97UL, 0xe2f05985UL, 0x8797e53dUL, - 0xd1878665UL, 0xb4e03addUL, 0x5a4f8fcfUL, 0x3f283377UL, 0x8610e4eaUL, - 0xe3775852UL, 0x0dd8ed40UL, 0x68bf51f8UL, 0xa1f82bf0UL, 0xc49f9748UL, - 0x2a30225aUL, 0x4f579ee2UL, 0xf66f497fUL, 0x9308f5c7UL, 0x7da740d5UL, - 0x18c0fc6dUL, 0x4ed09f35UL, 0x2bb7238dUL, 0xc518969fUL, 0xa07f2a27UL, - 0x1947fdbaUL, 0x7c204102UL, 0x928ff410UL, 0xf7e848a8UL, 0x3d58149bUL, - 0x583fa823UL, 0xb6901d31UL, 0xd3f7a189UL, 0x6acf7614UL, 0x0fa8caacUL, - 0xe1077fbeUL, 0x8460c306UL, 0xd270a05eUL, 0xb7171ce6UL, 0x59b8a9f4UL, - 0x3cdf154cUL, 0x85e7c2d1UL, 0xe0807e69UL, 0x0e2fcb7bUL, 0x6b4877c3UL, - 0xa20f0dcbUL, 0xc768b173UL, 0x29c70461UL, 0x4ca0b8d9UL, 0xf5986f44UL, - 0x90ffd3fcUL, 0x7e5066eeUL, 0x1b37da56UL, 0x4d27b90eUL, 0x284005b6UL, - 0xc6efb0a4UL, 0xa3880c1cUL, 0x1ab0db81UL, 0x7fd76739UL, 0x9178d22bUL, - 0xf41f6e93UL, 0x03f7263bUL, 0x66909a83UL, 0x883f2f91UL, 0xed589329UL, - 0x546044b4UL, 0x3107f80cUL, 0xdfa84d1eUL, 0xbacff1a6UL, 0xecdf92feUL, - 0x89b82e46UL, 0x67179b54UL, 0x027027ecUL, 0xbb48f071UL, 0xde2f4cc9UL, - 0x3080f9dbUL, 0x55e74563UL, 0x9ca03f6bUL, 0xf9c783d3UL, 0x176836c1UL, - 0x720f8a79UL, 0xcb375de4UL, 0xae50e15cUL, 0x40ff544eUL, 0x2598e8f6UL, - 0x73888baeUL, 0x16ef3716UL, 0xf8408204UL, 0x9d273ebcUL, 0x241fe921UL, - 0x41785599UL, 0xafd7e08bUL, 0xcab05c33UL, 0x3bb659edUL, 0x5ed1e555UL, - 0xb07e5047UL, 0xd519ecffUL, 0x6c213b62UL, 0x094687daUL, 0xe7e932c8UL, - 0x828e8e70UL, 0xd49eed28UL, 0xb1f95190UL, 0x5f56e482UL, 0x3a31583aUL, - 0x83098fa7UL, 0xe66e331fUL, 0x08c1860dUL, 0x6da63ab5UL, 0xa4e140bdUL, - 0xc186fc05UL, 0x2f294917UL, 0x4a4ef5afUL, 0xf3762232UL, 0x96119e8aUL, - 0x78be2b98UL, 0x1dd99720UL, 0x4bc9f478UL, 0x2eae48c0UL, 0xc001fdd2UL, - 0xa566416aUL, 0x1c5e96f7UL, 0x79392a4fUL, 0x97969f5dUL, 0xf2f123e5UL, - 0x05196b4dUL, 0x607ed7f5UL, 0x8ed162e7UL, 0xebb6de5fUL, 0x528e09c2UL, - 0x37e9b57aUL, 0xd9460068UL, 0xbc21bcd0UL, 0xea31df88UL, 0x8f566330UL, - 0x61f9d622UL, 0x049e6a9aUL, 0xbda6bd07UL, 0xd8c101bfUL, 0x366eb4adUL, - 0x53090815UL, 0x9a4e721dUL, 0xff29cea5UL, 0x11867bb7UL, 0x74e1c70fUL, - 0xcdd91092UL, 0xa8beac2aUL, 0x46111938UL, 0x2376a580UL, 0x7566c6d8UL, - 0x10017a60UL, 0xfeaecf72UL, 0x9bc973caUL, 0x22f1a457UL, 0x479618efUL, - 0xa939adfdUL, 0xcc5e1145UL, 0x06ee4d76UL, 0x6389f1ceUL, 0x8d2644dcUL, - 0xe841f864UL, 0x51792ff9UL, 0x341e9341UL, 0xdab12653UL, 0xbfd69aebUL, - 0xe9c6f9b3UL, 0x8ca1450bUL, 0x620ef019UL, 0x07694ca1UL, 0xbe519b3cUL, - 0xdb362784UL, 0x35999296UL, 0x50fe2e2eUL, 0x99b95426UL, 0xfcdee89eUL, - 0x12715d8cUL, 0x7716e134UL, 0xce2e36a9UL, 0xab498a11UL, 0x45e63f03UL, - 0x208183bbUL, 0x7691e0e3UL, 0x13f65c5bUL, 0xfd59e949UL, 0x983e55f1UL, - 0x2106826cUL, 0x44613ed4UL, 0xaace8bc6UL, 0xcfa9377eUL, 0x38417fd6UL, - 0x5d26c36eUL, 0xb389767cUL, 0xd6eecac4UL, 0x6fd61d59UL, 0x0ab1a1e1UL, - 0xe41e14f3UL, 0x8179a84bUL, 0xd769cb13UL, 0xb20e77abUL, 0x5ca1c2b9UL, - 0x39c67e01UL, 0x80fea99cUL, 0xe5991524UL, 0x0b36a036UL, 0x6e511c8eUL, - 0xa7166686UL, 0xc271da3eUL, 0x2cde6f2cUL, 0x49b9d394UL, 0xf0810409UL, - 0x95e6b8b1UL, 0x7b490da3UL, 0x1e2eb11bUL, 0x483ed243UL, 0x2d596efbUL, - 0xc3f6dbe9UL, 0xa6916751UL, 0x1fa9b0ccUL, 0x7ace0c74UL, 0x9461b966UL, - 0xf10605deUL +local const z_crc_t FAR crc_table[] = { + 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, + 0x706af48f, 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, + 0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, + 0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, + 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856, + 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9, + 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, + 0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, + 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, + 0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a, + 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599, + 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, + 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, + 0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, + 0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e, + 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01, + 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed, + 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950, + 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, + 0xfbd44c65, 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, + 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, + 0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5, + 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010, + 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, + 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, + 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, + 0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615, + 0x73dc1683, 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8, + 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 0xf00f9344, + 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, + 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, + 0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, + 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, + 0xa6bc5767, 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c, + 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef, + 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, + 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, + 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, + 0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c, + 0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713, + 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b, + 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242, + 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, + 0x18b74777, 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, + 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, 0xa00ae278, + 0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7, + 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66, + 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, + 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, + 0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, + 0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, + 0x2d02ef8d}; + +#ifdef W + +#if W == 8 + +local const z_word_t FAR crc_big_table[] = { + 0x0000000000000000, 0x9630077700000000, 0x2c610eee00000000, + 0xba51099900000000, 0x19c46d0700000000, 0x8ff46a7000000000, + 0x35a563e900000000, 0xa395649e00000000, 0x3288db0e00000000, + 0xa4b8dc7900000000, 0x1ee9d5e000000000, 0x88d9d29700000000, + 0x2b4cb60900000000, 0xbd7cb17e00000000, 0x072db8e700000000, + 0x911dbf9000000000, 0x6410b71d00000000, 0xf220b06a00000000, + 0x4871b9f300000000, 0xde41be8400000000, 0x7dd4da1a00000000, + 0xebe4dd6d00000000, 0x51b5d4f400000000, 0xc785d38300000000, + 0x56986c1300000000, 0xc0a86b6400000000, 0x7af962fd00000000, + 0xecc9658a00000000, 0x4f5c011400000000, 0xd96c066300000000, + 0x633d0ffa00000000, 0xf50d088d00000000, 0xc8206e3b00000000, + 0x5e10694c00000000, 0xe44160d500000000, 0x727167a200000000, + 0xd1e4033c00000000, 0x47d4044b00000000, 0xfd850dd200000000, + 0x6bb50aa500000000, 0xfaa8b53500000000, 0x6c98b24200000000, + 0xd6c9bbdb00000000, 0x40f9bcac00000000, 0xe36cd83200000000, + 0x755cdf4500000000, 0xcf0dd6dc00000000, 0x593dd1ab00000000, + 0xac30d92600000000, 0x3a00de5100000000, 0x8051d7c800000000, + 0x1661d0bf00000000, 0xb5f4b42100000000, 0x23c4b35600000000, + 0x9995bacf00000000, 0x0fa5bdb800000000, 0x9eb8022800000000, + 0x0888055f00000000, 0xb2d90cc600000000, 0x24e90bb100000000, + 0x877c6f2f00000000, 0x114c685800000000, 0xab1d61c100000000, + 0x3d2d66b600000000, 0x9041dc7600000000, 0x0671db0100000000, + 0xbc20d29800000000, 0x2a10d5ef00000000, 0x8985b17100000000, + 0x1fb5b60600000000, 0xa5e4bf9f00000000, 0x33d4b8e800000000, + 0xa2c9077800000000, 0x34f9000f00000000, 0x8ea8099600000000, + 0x18980ee100000000, 0xbb0d6a7f00000000, 0x2d3d6d0800000000, + 0x976c649100000000, 0x015c63e600000000, 0xf4516b6b00000000, + 0x62616c1c00000000, 0xd830658500000000, 0x4e0062f200000000, + 0xed95066c00000000, 0x7ba5011b00000000, 0xc1f4088200000000, + 0x57c40ff500000000, 0xc6d9b06500000000, 0x50e9b71200000000, + 0xeab8be8b00000000, 0x7c88b9fc00000000, 0xdf1ddd6200000000, + 0x492dda1500000000, 0xf37cd38c00000000, 0x654cd4fb00000000, + 0x5861b24d00000000, 0xce51b53a00000000, 0x7400bca300000000, + 0xe230bbd400000000, 0x41a5df4a00000000, 0xd795d83d00000000, + 0x6dc4d1a400000000, 0xfbf4d6d300000000, 0x6ae9694300000000, + 0xfcd96e3400000000, 0x468867ad00000000, 0xd0b860da00000000, + 0x732d044400000000, 0xe51d033300000000, 0x5f4c0aaa00000000, + 0xc97c0ddd00000000, 0x3c71055000000000, 0xaa41022700000000, + 0x10100bbe00000000, 0x86200cc900000000, 0x25b5685700000000, + 0xb3856f2000000000, 0x09d466b900000000, 0x9fe461ce00000000, + 0x0ef9de5e00000000, 0x98c9d92900000000, 0x2298d0b000000000, + 0xb4a8d7c700000000, 0x173db35900000000, 0x810db42e00000000, + 0x3b5cbdb700000000, 0xad6cbac000000000, 0x2083b8ed00000000, + 0xb6b3bf9a00000000, 0x0ce2b60300000000, 0x9ad2b17400000000, + 0x3947d5ea00000000, 0xaf77d29d00000000, 0x1526db0400000000, + 0x8316dc7300000000, 0x120b63e300000000, 0x843b649400000000, + 0x3e6a6d0d00000000, 0xa85a6a7a00000000, 0x0bcf0ee400000000, + 0x9dff099300000000, 0x27ae000a00000000, 0xb19e077d00000000, + 0x44930ff000000000, 0xd2a3088700000000, 0x68f2011e00000000, + 0xfec2066900000000, 0x5d5762f700000000, 0xcb67658000000000, + 0x71366c1900000000, 0xe7066b6e00000000, 0x761bd4fe00000000, + 0xe02bd38900000000, 0x5a7ada1000000000, 0xcc4add6700000000, + 0x6fdfb9f900000000, 0xf9efbe8e00000000, 0x43beb71700000000, + 0xd58eb06000000000, 0xe8a3d6d600000000, 0x7e93d1a100000000, + 0xc4c2d83800000000, 0x52f2df4f00000000, 0xf167bbd100000000, + 0x6757bca600000000, 0xdd06b53f00000000, 0x4b36b24800000000, + 0xda2b0dd800000000, 0x4c1b0aaf00000000, 0xf64a033600000000, + 0x607a044100000000, 0xc3ef60df00000000, 0x55df67a800000000, + 0xef8e6e3100000000, 0x79be694600000000, 0x8cb361cb00000000, + 0x1a8366bc00000000, 0xa0d26f2500000000, 0x36e2685200000000, + 0x95770ccc00000000, 0x03470bbb00000000, 0xb916022200000000, + 0x2f26055500000000, 0xbe3bbac500000000, 0x280bbdb200000000, + 0x925ab42b00000000, 0x046ab35c00000000, 0xa7ffd7c200000000, + 0x31cfd0b500000000, 0x8b9ed92c00000000, 0x1daede5b00000000, + 0xb0c2649b00000000, 0x26f263ec00000000, 0x9ca36a7500000000, + 0x0a936d0200000000, 0xa906099c00000000, 0x3f360eeb00000000, + 0x8567077200000000, 0x1357000500000000, 0x824abf9500000000, + 0x147ab8e200000000, 0xae2bb17b00000000, 0x381bb60c00000000, + 0x9b8ed29200000000, 0x0dbed5e500000000, 0xb7efdc7c00000000, + 0x21dfdb0b00000000, 0xd4d2d38600000000, 0x42e2d4f100000000, + 0xf8b3dd6800000000, 0x6e83da1f00000000, 0xcd16be8100000000, + 0x5b26b9f600000000, 0xe177b06f00000000, 0x7747b71800000000, + 0xe65a088800000000, 0x706a0fff00000000, 0xca3b066600000000, + 0x5c0b011100000000, 0xff9e658f00000000, 0x69ae62f800000000, + 0xd3ff6b6100000000, 0x45cf6c1600000000, 0x78e20aa000000000, + 0xeed20dd700000000, 0x5483044e00000000, 0xc2b3033900000000, + 0x612667a700000000, 0xf71660d000000000, 0x4d47694900000000, + 0xdb776e3e00000000, 0x4a6ad1ae00000000, 0xdc5ad6d900000000, + 0x660bdf4000000000, 0xf03bd83700000000, 0x53aebca900000000, + 0xc59ebbde00000000, 0x7fcfb24700000000, 0xe9ffb53000000000, + 0x1cf2bdbd00000000, 0x8ac2baca00000000, 0x3093b35300000000, + 0xa6a3b42400000000, 0x0536d0ba00000000, 0x9306d7cd00000000, + 0x2957de5400000000, 0xbf67d92300000000, 0x2e7a66b300000000, + 0xb84a61c400000000, 0x021b685d00000000, 0x942b6f2a00000000, + 0x37be0bb400000000, 0xa18e0cc300000000, 0x1bdf055a00000000, + 0x8def022d00000000}; + +#else /* W == 4 */ + +local const z_word_t FAR crc_big_table[] = { + 0x00000000, 0x96300777, 0x2c610eee, 0xba510999, 0x19c46d07, + 0x8ff46a70, 0x35a563e9, 0xa395649e, 0x3288db0e, 0xa4b8dc79, + 0x1ee9d5e0, 0x88d9d297, 0x2b4cb609, 0xbd7cb17e, 0x072db8e7, + 0x911dbf90, 0x6410b71d, 0xf220b06a, 0x4871b9f3, 0xde41be84, + 0x7dd4da1a, 0xebe4dd6d, 0x51b5d4f4, 0xc785d383, 0x56986c13, + 0xc0a86b64, 0x7af962fd, 0xecc9658a, 0x4f5c0114, 0xd96c0663, + 0x633d0ffa, 0xf50d088d, 0xc8206e3b, 0x5e10694c, 0xe44160d5, + 0x727167a2, 0xd1e4033c, 0x47d4044b, 0xfd850dd2, 0x6bb50aa5, + 0xfaa8b535, 0x6c98b242, 0xd6c9bbdb, 0x40f9bcac, 0xe36cd832, + 0x755cdf45, 0xcf0dd6dc, 0x593dd1ab, 0xac30d926, 0x3a00de51, + 0x8051d7c8, 0x1661d0bf, 0xb5f4b421, 0x23c4b356, 0x9995bacf, + 0x0fa5bdb8, 0x9eb80228, 0x0888055f, 0xb2d90cc6, 0x24e90bb1, + 0x877c6f2f, 0x114c6858, 0xab1d61c1, 0x3d2d66b6, 0x9041dc76, + 0x0671db01, 0xbc20d298, 0x2a10d5ef, 0x8985b171, 0x1fb5b606, + 0xa5e4bf9f, 0x33d4b8e8, 0xa2c90778, 0x34f9000f, 0x8ea80996, + 0x18980ee1, 0xbb0d6a7f, 0x2d3d6d08, 0x976c6491, 0x015c63e6, + 0xf4516b6b, 0x62616c1c, 0xd8306585, 0x4e0062f2, 0xed95066c, + 0x7ba5011b, 0xc1f40882, 0x57c40ff5, 0xc6d9b065, 0x50e9b712, + 0xeab8be8b, 0x7c88b9fc, 0xdf1ddd62, 0x492dda15, 0xf37cd38c, + 0x654cd4fb, 0x5861b24d, 0xce51b53a, 0x7400bca3, 0xe230bbd4, + 0x41a5df4a, 0xd795d83d, 0x6dc4d1a4, 0xfbf4d6d3, 0x6ae96943, + 0xfcd96e34, 0x468867ad, 0xd0b860da, 0x732d0444, 0xe51d0333, + 0x5f4c0aaa, 0xc97c0ddd, 0x3c710550, 0xaa410227, 0x10100bbe, + 0x86200cc9, 0x25b56857, 0xb3856f20, 0x09d466b9, 0x9fe461ce, + 0x0ef9de5e, 0x98c9d929, 0x2298d0b0, 0xb4a8d7c7, 0x173db359, + 0x810db42e, 0x3b5cbdb7, 0xad6cbac0, 0x2083b8ed, 0xb6b3bf9a, + 0x0ce2b603, 0x9ad2b174, 0x3947d5ea, 0xaf77d29d, 0x1526db04, + 0x8316dc73, 0x120b63e3, 0x843b6494, 0x3e6a6d0d, 0xa85a6a7a, + 0x0bcf0ee4, 0x9dff0993, 0x27ae000a, 0xb19e077d, 0x44930ff0, + 0xd2a30887, 0x68f2011e, 0xfec20669, 0x5d5762f7, 0xcb676580, + 0x71366c19, 0xe7066b6e, 0x761bd4fe, 0xe02bd389, 0x5a7ada10, + 0xcc4add67, 0x6fdfb9f9, 0xf9efbe8e, 0x43beb717, 0xd58eb060, + 0xe8a3d6d6, 0x7e93d1a1, 0xc4c2d838, 0x52f2df4f, 0xf167bbd1, + 0x6757bca6, 0xdd06b53f, 0x4b36b248, 0xda2b0dd8, 0x4c1b0aaf, + 0xf64a0336, 0x607a0441, 0xc3ef60df, 0x55df67a8, 0xef8e6e31, + 0x79be6946, 0x8cb361cb, 0x1a8366bc, 0xa0d26f25, 0x36e26852, + 0x95770ccc, 0x03470bbb, 0xb9160222, 0x2f260555, 0xbe3bbac5, + 0x280bbdb2, 0x925ab42b, 0x046ab35c, 0xa7ffd7c2, 0x31cfd0b5, + 0x8b9ed92c, 0x1daede5b, 0xb0c2649b, 0x26f263ec, 0x9ca36a75, + 0x0a936d02, 0xa906099c, 0x3f360eeb, 0x85670772, 0x13570005, + 0x824abf95, 0x147ab8e2, 0xae2bb17b, 0x381bb60c, 0x9b8ed292, + 0x0dbed5e5, 0xb7efdc7c, 0x21dfdb0b, 0xd4d2d386, 0x42e2d4f1, + 0xf8b3dd68, 0x6e83da1f, 0xcd16be81, 0x5b26b9f6, 0xe177b06f, + 0x7747b718, 0xe65a0888, 0x706a0fff, 0xca3b0666, 0x5c0b0111, + 0xff9e658f, 0x69ae62f8, 0xd3ff6b61, 0x45cf6c16, 0x78e20aa0, + 0xeed20dd7, 0x5483044e, 0xc2b30339, 0x612667a7, 0xf71660d0, + 0x4d476949, 0xdb776e3e, 0x4a6ad1ae, 0xdc5ad6d9, 0x660bdf40, + 0xf03bd837, 0x53aebca9, 0xc59ebbde, 0x7fcfb247, 0xe9ffb530, + 0x1cf2bdbd, 0x8ac2baca, 0x3093b353, 0xa6a3b424, 0x0536d0ba, + 0x9306d7cd, 0x2957de54, 0xbf67d923, 0x2e7a66b3, 0xb84a61c4, + 0x021b685d, 0x942b6f2a, 0x37be0bb4, 0xa18e0cc3, 0x1bdf055a, + 0x8def022d}; + +#endif + +#if N == 1 + +#if W == 8 + +local const z_crc_t FAR crc_braid_table[][256] = { + {0x00000000, 0xccaa009e, 0x4225077d, 0x8e8f07e3, 0x844a0efa, + 0x48e00e64, 0xc66f0987, 0x0ac50919, 0xd3e51bb5, 0x1f4f1b2b, + 0x91c01cc8, 0x5d6a1c56, 0x57af154f, 0x9b0515d1, 0x158a1232, + 0xd92012ac, 0x7cbb312b, 0xb01131b5, 0x3e9e3656, 0xf23436c8, + 0xf8f13fd1, 0x345b3f4f, 0xbad438ac, 0x767e3832, 0xaf5e2a9e, + 0x63f42a00, 0xed7b2de3, 0x21d12d7d, 0x2b142464, 0xe7be24fa, + 0x69312319, 0xa59b2387, 0xf9766256, 0x35dc62c8, 0xbb53652b, + 0x77f965b5, 0x7d3c6cac, 0xb1966c32, 0x3f196bd1, 0xf3b36b4f, + 0x2a9379e3, 0xe639797d, 0x68b67e9e, 0xa41c7e00, 0xaed97719, + 0x62737787, 0xecfc7064, 0x205670fa, 0x85cd537d, 0x496753e3, + 0xc7e85400, 0x0b42549e, 0x01875d87, 0xcd2d5d19, 0x43a25afa, + 0x8f085a64, 0x562848c8, 0x9a824856, 0x140d4fb5, 0xd8a74f2b, + 0xd2624632, 0x1ec846ac, 0x9047414f, 0x5ced41d1, 0x299dc2ed, + 0xe537c273, 0x6bb8c590, 0xa712c50e, 0xadd7cc17, 0x617dcc89, + 0xeff2cb6a, 0x2358cbf4, 0xfa78d958, 0x36d2d9c6, 0xb85dde25, + 0x74f7debb, 0x7e32d7a2, 0xb298d73c, 0x3c17d0df, 0xf0bdd041, + 0x5526f3c6, 0x998cf358, 0x1703f4bb, 0xdba9f425, 0xd16cfd3c, + 0x1dc6fda2, 0x9349fa41, 0x5fe3fadf, 0x86c3e873, 0x4a69e8ed, + 0xc4e6ef0e, 0x084cef90, 0x0289e689, 0xce23e617, 0x40ace1f4, + 0x8c06e16a, 0xd0eba0bb, 0x1c41a025, 0x92cea7c6, 0x5e64a758, + 0x54a1ae41, 0x980baedf, 0x1684a93c, 0xda2ea9a2, 0x030ebb0e, + 0xcfa4bb90, 0x412bbc73, 0x8d81bced, 0x8744b5f4, 0x4beeb56a, + 0xc561b289, 0x09cbb217, 0xac509190, 0x60fa910e, 0xee7596ed, + 0x22df9673, 0x281a9f6a, 0xe4b09ff4, 0x6a3f9817, 0xa6959889, + 0x7fb58a25, 0xb31f8abb, 0x3d908d58, 0xf13a8dc6, 0xfbff84df, + 0x37558441, 0xb9da83a2, 0x7570833c, 0x533b85da, 0x9f918544, + 0x111e82a7, 0xddb48239, 0xd7718b20, 0x1bdb8bbe, 0x95548c5d, + 0x59fe8cc3, 0x80de9e6f, 0x4c749ef1, 0xc2fb9912, 0x0e51998c, + 0x04949095, 0xc83e900b, 0x46b197e8, 0x8a1b9776, 0x2f80b4f1, + 0xe32ab46f, 0x6da5b38c, 0xa10fb312, 0xabcaba0b, 0x6760ba95, + 0xe9efbd76, 0x2545bde8, 0xfc65af44, 0x30cfafda, 0xbe40a839, + 0x72eaa8a7, 0x782fa1be, 0xb485a120, 0x3a0aa6c3, 0xf6a0a65d, + 0xaa4de78c, 0x66e7e712, 0xe868e0f1, 0x24c2e06f, 0x2e07e976, + 0xe2ade9e8, 0x6c22ee0b, 0xa088ee95, 0x79a8fc39, 0xb502fca7, + 0x3b8dfb44, 0xf727fbda, 0xfde2f2c3, 0x3148f25d, 0xbfc7f5be, + 0x736df520, 0xd6f6d6a7, 0x1a5cd639, 0x94d3d1da, 0x5879d144, + 0x52bcd85d, 0x9e16d8c3, 0x1099df20, 0xdc33dfbe, 0x0513cd12, + 0xc9b9cd8c, 0x4736ca6f, 0x8b9ccaf1, 0x8159c3e8, 0x4df3c376, + 0xc37cc495, 0x0fd6c40b, 0x7aa64737, 0xb60c47a9, 0x3883404a, + 0xf42940d4, 0xfeec49cd, 0x32464953, 0xbcc94eb0, 0x70634e2e, + 0xa9435c82, 0x65e95c1c, 0xeb665bff, 0x27cc5b61, 0x2d095278, + 0xe1a352e6, 0x6f2c5505, 0xa386559b, 0x061d761c, 0xcab77682, + 0x44387161, 0x889271ff, 0x825778e6, 0x4efd7878, 0xc0727f9b, + 0x0cd87f05, 0xd5f86da9, 0x19526d37, 0x97dd6ad4, 0x5b776a4a, + 0x51b26353, 0x9d1863cd, 0x1397642e, 0xdf3d64b0, 0x83d02561, + 0x4f7a25ff, 0xc1f5221c, 0x0d5f2282, 0x079a2b9b, 0xcb302b05, + 0x45bf2ce6, 0x89152c78, 0x50353ed4, 0x9c9f3e4a, 0x121039a9, + 0xdeba3937, 0xd47f302e, 0x18d530b0, 0x965a3753, 0x5af037cd, + 0xff6b144a, 0x33c114d4, 0xbd4e1337, 0x71e413a9, 0x7b211ab0, + 0xb78b1a2e, 0x39041dcd, 0xf5ae1d53, 0x2c8e0fff, 0xe0240f61, + 0x6eab0882, 0xa201081c, 0xa8c40105, 0x646e019b, 0xeae10678, + 0x264b06e6}, + {0x00000000, 0xa6770bb4, 0x979f1129, 0x31e81a9d, 0xf44f2413, + 0x52382fa7, 0x63d0353a, 0xc5a73e8e, 0x33ef4e67, 0x959845d3, + 0xa4705f4e, 0x020754fa, 0xc7a06a74, 0x61d761c0, 0x503f7b5d, + 0xf64870e9, 0x67de9cce, 0xc1a9977a, 0xf0418de7, 0x56368653, + 0x9391b8dd, 0x35e6b369, 0x040ea9f4, 0xa279a240, 0x5431d2a9, + 0xf246d91d, 0xc3aec380, 0x65d9c834, 0xa07ef6ba, 0x0609fd0e, + 0x37e1e793, 0x9196ec27, 0xcfbd399c, 0x69ca3228, 0x582228b5, + 0xfe552301, 0x3bf21d8f, 0x9d85163b, 0xac6d0ca6, 0x0a1a0712, + 0xfc5277fb, 0x5a257c4f, 0x6bcd66d2, 0xcdba6d66, 0x081d53e8, + 0xae6a585c, 0x9f8242c1, 0x39f54975, 0xa863a552, 0x0e14aee6, + 0x3ffcb47b, 0x998bbfcf, 0x5c2c8141, 0xfa5b8af5, 0xcbb39068, + 0x6dc49bdc, 0x9b8ceb35, 0x3dfbe081, 0x0c13fa1c, 0xaa64f1a8, + 0x6fc3cf26, 0xc9b4c492, 0xf85cde0f, 0x5e2bd5bb, 0x440b7579, + 0xe27c7ecd, 0xd3946450, 0x75e36fe4, 0xb044516a, 0x16335ade, + 0x27db4043, 0x81ac4bf7, 0x77e43b1e, 0xd19330aa, 0xe07b2a37, + 0x460c2183, 0x83ab1f0d, 0x25dc14b9, 0x14340e24, 0xb2430590, + 0x23d5e9b7, 0x85a2e203, 0xb44af89e, 0x123df32a, 0xd79acda4, + 0x71edc610, 0x4005dc8d, 0xe672d739, 0x103aa7d0, 0xb64dac64, + 0x87a5b6f9, 0x21d2bd4d, 0xe47583c3, 0x42028877, 0x73ea92ea, + 0xd59d995e, 0x8bb64ce5, 0x2dc14751, 0x1c295dcc, 0xba5e5678, + 0x7ff968f6, 0xd98e6342, 0xe86679df, 0x4e11726b, 0xb8590282, + 0x1e2e0936, 0x2fc613ab, 0x89b1181f, 0x4c162691, 0xea612d25, + 0xdb8937b8, 0x7dfe3c0c, 0xec68d02b, 0x4a1fdb9f, 0x7bf7c102, + 0xdd80cab6, 0x1827f438, 0xbe50ff8c, 0x8fb8e511, 0x29cfeea5, + 0xdf879e4c, 0x79f095f8, 0x48188f65, 0xee6f84d1, 0x2bc8ba5f, + 0x8dbfb1eb, 0xbc57ab76, 0x1a20a0c2, 0x8816eaf2, 0x2e61e146, + 0x1f89fbdb, 0xb9fef06f, 0x7c59cee1, 0xda2ec555, 0xebc6dfc8, + 0x4db1d47c, 0xbbf9a495, 0x1d8eaf21, 0x2c66b5bc, 0x8a11be08, + 0x4fb68086, 0xe9c18b32, 0xd82991af, 0x7e5e9a1b, 0xefc8763c, + 0x49bf7d88, 0x78576715, 0xde206ca1, 0x1b87522f, 0xbdf0599b, + 0x8c184306, 0x2a6f48b2, 0xdc27385b, 0x7a5033ef, 0x4bb82972, + 0xedcf22c6, 0x28681c48, 0x8e1f17fc, 0xbff70d61, 0x198006d5, + 0x47abd36e, 0xe1dcd8da, 0xd034c247, 0x7643c9f3, 0xb3e4f77d, + 0x1593fcc9, 0x247be654, 0x820cede0, 0x74449d09, 0xd23396bd, + 0xe3db8c20, 0x45ac8794, 0x800bb91a, 0x267cb2ae, 0x1794a833, + 0xb1e3a387, 0x20754fa0, 0x86024414, 0xb7ea5e89, 0x119d553d, + 0xd43a6bb3, 0x724d6007, 0x43a57a9a, 0xe5d2712e, 0x139a01c7, + 0xb5ed0a73, 0x840510ee, 0x22721b5a, 0xe7d525d4, 0x41a22e60, + 0x704a34fd, 0xd63d3f49, 0xcc1d9f8b, 0x6a6a943f, 0x5b828ea2, + 0xfdf58516, 0x3852bb98, 0x9e25b02c, 0xafcdaab1, 0x09baa105, + 0xfff2d1ec, 0x5985da58, 0x686dc0c5, 0xce1acb71, 0x0bbdf5ff, + 0xadcafe4b, 0x9c22e4d6, 0x3a55ef62, 0xabc30345, 0x0db408f1, + 0x3c5c126c, 0x9a2b19d8, 0x5f8c2756, 0xf9fb2ce2, 0xc813367f, + 0x6e643dcb, 0x982c4d22, 0x3e5b4696, 0x0fb35c0b, 0xa9c457bf, + 0x6c636931, 0xca146285, 0xfbfc7818, 0x5d8b73ac, 0x03a0a617, + 0xa5d7ada3, 0x943fb73e, 0x3248bc8a, 0xf7ef8204, 0x519889b0, + 0x6070932d, 0xc6079899, 0x304fe870, 0x9638e3c4, 0xa7d0f959, + 0x01a7f2ed, 0xc400cc63, 0x6277c7d7, 0x539fdd4a, 0xf5e8d6fe, + 0x647e3ad9, 0xc209316d, 0xf3e12bf0, 0x55962044, 0x90311eca, + 0x3646157e, 0x07ae0fe3, 0xa1d90457, 0x579174be, 0xf1e67f0a, + 0xc00e6597, 0x66796e23, 0xa3de50ad, 0x05a95b19, 0x34414184, + 0x92364a30}, + {0x00000000, 0xcb5cd3a5, 0x4dc8a10b, 0x869472ae, 0x9b914216, + 0x50cd91b3, 0xd659e31d, 0x1d0530b8, 0xec53826d, 0x270f51c8, + 0xa19b2366, 0x6ac7f0c3, 0x77c2c07b, 0xbc9e13de, 0x3a0a6170, + 0xf156b2d5, 0x03d6029b, 0xc88ad13e, 0x4e1ea390, 0x85427035, + 0x9847408d, 0x531b9328, 0xd58fe186, 0x1ed33223, 0xef8580f6, + 0x24d95353, 0xa24d21fd, 0x6911f258, 0x7414c2e0, 0xbf481145, + 0x39dc63eb, 0xf280b04e, 0x07ac0536, 0xccf0d693, 0x4a64a43d, + 0x81387798, 0x9c3d4720, 0x57619485, 0xd1f5e62b, 0x1aa9358e, + 0xebff875b, 0x20a354fe, 0xa6372650, 0x6d6bf5f5, 0x706ec54d, + 0xbb3216e8, 0x3da66446, 0xf6fab7e3, 0x047a07ad, 0xcf26d408, + 0x49b2a6a6, 0x82ee7503, 0x9feb45bb, 0x54b7961e, 0xd223e4b0, + 0x197f3715, 0xe82985c0, 0x23755665, 0xa5e124cb, 0x6ebdf76e, + 0x73b8c7d6, 0xb8e41473, 0x3e7066dd, 0xf52cb578, 0x0f580a6c, + 0xc404d9c9, 0x4290ab67, 0x89cc78c2, 0x94c9487a, 0x5f959bdf, + 0xd901e971, 0x125d3ad4, 0xe30b8801, 0x28575ba4, 0xaec3290a, + 0x659ffaaf, 0x789aca17, 0xb3c619b2, 0x35526b1c, 0xfe0eb8b9, + 0x0c8e08f7, 0xc7d2db52, 0x4146a9fc, 0x8a1a7a59, 0x971f4ae1, + 0x5c439944, 0xdad7ebea, 0x118b384f, 0xe0dd8a9a, 0x2b81593f, + 0xad152b91, 0x6649f834, 0x7b4cc88c, 0xb0101b29, 0x36846987, + 0xfdd8ba22, 0x08f40f5a, 0xc3a8dcff, 0x453cae51, 0x8e607df4, + 0x93654d4c, 0x58399ee9, 0xdeadec47, 0x15f13fe2, 0xe4a78d37, + 0x2ffb5e92, 0xa96f2c3c, 0x6233ff99, 0x7f36cf21, 0xb46a1c84, + 0x32fe6e2a, 0xf9a2bd8f, 0x0b220dc1, 0xc07ede64, 0x46eaacca, + 0x8db67f6f, 0x90b34fd7, 0x5bef9c72, 0xdd7beedc, 0x16273d79, + 0xe7718fac, 0x2c2d5c09, 0xaab92ea7, 0x61e5fd02, 0x7ce0cdba, + 0xb7bc1e1f, 0x31286cb1, 0xfa74bf14, 0x1eb014d8, 0xd5ecc77d, + 0x5378b5d3, 0x98246676, 0x852156ce, 0x4e7d856b, 0xc8e9f7c5, + 0x03b52460, 0xf2e396b5, 0x39bf4510, 0xbf2b37be, 0x7477e41b, + 0x6972d4a3, 0xa22e0706, 0x24ba75a8, 0xefe6a60d, 0x1d661643, + 0xd63ac5e6, 0x50aeb748, 0x9bf264ed, 0x86f75455, 0x4dab87f0, + 0xcb3ff55e, 0x006326fb, 0xf135942e, 0x3a69478b, 0xbcfd3525, + 0x77a1e680, 0x6aa4d638, 0xa1f8059d, 0x276c7733, 0xec30a496, + 0x191c11ee, 0xd240c24b, 0x54d4b0e5, 0x9f886340, 0x828d53f8, + 0x49d1805d, 0xcf45f2f3, 0x04192156, 0xf54f9383, 0x3e134026, + 0xb8873288, 0x73dbe12d, 0x6eded195, 0xa5820230, 0x2316709e, + 0xe84aa33b, 0x1aca1375, 0xd196c0d0, 0x5702b27e, 0x9c5e61db, + 0x815b5163, 0x4a0782c6, 0xcc93f068, 0x07cf23cd, 0xf6999118, + 0x3dc542bd, 0xbb513013, 0x700de3b6, 0x6d08d30e, 0xa65400ab, + 0x20c07205, 0xeb9ca1a0, 0x11e81eb4, 0xdab4cd11, 0x5c20bfbf, + 0x977c6c1a, 0x8a795ca2, 0x41258f07, 0xc7b1fda9, 0x0ced2e0c, + 0xfdbb9cd9, 0x36e74f7c, 0xb0733dd2, 0x7b2fee77, 0x662adecf, + 0xad760d6a, 0x2be27fc4, 0xe0beac61, 0x123e1c2f, 0xd962cf8a, + 0x5ff6bd24, 0x94aa6e81, 0x89af5e39, 0x42f38d9c, 0xc467ff32, + 0x0f3b2c97, 0xfe6d9e42, 0x35314de7, 0xb3a53f49, 0x78f9ecec, + 0x65fcdc54, 0xaea00ff1, 0x28347d5f, 0xe368aefa, 0x16441b82, + 0xdd18c827, 0x5b8cba89, 0x90d0692c, 0x8dd55994, 0x46898a31, + 0xc01df89f, 0x0b412b3a, 0xfa1799ef, 0x314b4a4a, 0xb7df38e4, + 0x7c83eb41, 0x6186dbf9, 0xaada085c, 0x2c4e7af2, 0xe712a957, + 0x15921919, 0xdececabc, 0x585ab812, 0x93066bb7, 0x8e035b0f, + 0x455f88aa, 0xc3cbfa04, 0x089729a1, 0xf9c19b74, 0x329d48d1, + 0xb4093a7f, 0x7f55e9da, 0x6250d962, 0xa90c0ac7, 0x2f987869, + 0xe4c4abcc}, + {0x00000000, 0x3d6029b0, 0x7ac05360, 0x47a07ad0, 0xf580a6c0, + 0xc8e08f70, 0x8f40f5a0, 0xb220dc10, 0x30704bc1, 0x0d106271, + 0x4ab018a1, 0x77d03111, 0xc5f0ed01, 0xf890c4b1, 0xbf30be61, + 0x825097d1, 0x60e09782, 0x5d80be32, 0x1a20c4e2, 0x2740ed52, + 0x95603142, 0xa80018f2, 0xefa06222, 0xd2c04b92, 0x5090dc43, + 0x6df0f5f3, 0x2a508f23, 0x1730a693, 0xa5107a83, 0x98705333, + 0xdfd029e3, 0xe2b00053, 0xc1c12f04, 0xfca106b4, 0xbb017c64, + 0x866155d4, 0x344189c4, 0x0921a074, 0x4e81daa4, 0x73e1f314, + 0xf1b164c5, 0xccd14d75, 0x8b7137a5, 0xb6111e15, 0x0431c205, + 0x3951ebb5, 0x7ef19165, 0x4391b8d5, 0xa121b886, 0x9c419136, + 0xdbe1ebe6, 0xe681c256, 0x54a11e46, 0x69c137f6, 0x2e614d26, + 0x13016496, 0x9151f347, 0xac31daf7, 0xeb91a027, 0xd6f18997, + 0x64d15587, 0x59b17c37, 0x1e1106e7, 0x23712f57, 0x58f35849, + 0x659371f9, 0x22330b29, 0x1f532299, 0xad73fe89, 0x9013d739, + 0xd7b3ade9, 0xead38459, 0x68831388, 0x55e33a38, 0x124340e8, + 0x2f236958, 0x9d03b548, 0xa0639cf8, 0xe7c3e628, 0xdaa3cf98, + 0x3813cfcb, 0x0573e67b, 0x42d39cab, 0x7fb3b51b, 0xcd93690b, + 0xf0f340bb, 0xb7533a6b, 0x8a3313db, 0x0863840a, 0x3503adba, + 0x72a3d76a, 0x4fc3feda, 0xfde322ca, 0xc0830b7a, 0x872371aa, + 0xba43581a, 0x9932774d, 0xa4525efd, 0xe3f2242d, 0xde920d9d, + 0x6cb2d18d, 0x51d2f83d, 0x167282ed, 0x2b12ab5d, 0xa9423c8c, + 0x9422153c, 0xd3826fec, 0xeee2465c, 0x5cc29a4c, 0x61a2b3fc, + 0x2602c92c, 0x1b62e09c, 0xf9d2e0cf, 0xc4b2c97f, 0x8312b3af, + 0xbe729a1f, 0x0c52460f, 0x31326fbf, 0x7692156f, 0x4bf23cdf, + 0xc9a2ab0e, 0xf4c282be, 0xb362f86e, 0x8e02d1de, 0x3c220dce, + 0x0142247e, 0x46e25eae, 0x7b82771e, 0xb1e6b092, 0x8c869922, + 0xcb26e3f2, 0xf646ca42, 0x44661652, 0x79063fe2, 0x3ea64532, + 0x03c66c82, 0x8196fb53, 0xbcf6d2e3, 0xfb56a833, 0xc6368183, + 0x74165d93, 0x49767423, 0x0ed60ef3, 0x33b62743, 0xd1062710, + 0xec660ea0, 0xabc67470, 0x96a65dc0, 0x248681d0, 0x19e6a860, + 0x5e46d2b0, 0x6326fb00, 0xe1766cd1, 0xdc164561, 0x9bb63fb1, + 0xa6d61601, 0x14f6ca11, 0x2996e3a1, 0x6e369971, 0x5356b0c1, + 0x70279f96, 0x4d47b626, 0x0ae7ccf6, 0x3787e546, 0x85a73956, + 0xb8c710e6, 0xff676a36, 0xc2074386, 0x4057d457, 0x7d37fde7, + 0x3a978737, 0x07f7ae87, 0xb5d77297, 0x88b75b27, 0xcf1721f7, + 0xf2770847, 0x10c70814, 0x2da721a4, 0x6a075b74, 0x576772c4, + 0xe547aed4, 0xd8278764, 0x9f87fdb4, 0xa2e7d404, 0x20b743d5, + 0x1dd76a65, 0x5a7710b5, 0x67173905, 0xd537e515, 0xe857cca5, + 0xaff7b675, 0x92979fc5, 0xe915e8db, 0xd475c16b, 0x93d5bbbb, + 0xaeb5920b, 0x1c954e1b, 0x21f567ab, 0x66551d7b, 0x5b3534cb, + 0xd965a31a, 0xe4058aaa, 0xa3a5f07a, 0x9ec5d9ca, 0x2ce505da, + 0x11852c6a, 0x562556ba, 0x6b457f0a, 0x89f57f59, 0xb49556e9, + 0xf3352c39, 0xce550589, 0x7c75d999, 0x4115f029, 0x06b58af9, + 0x3bd5a349, 0xb9853498, 0x84e51d28, 0xc34567f8, 0xfe254e48, + 0x4c059258, 0x7165bbe8, 0x36c5c138, 0x0ba5e888, 0x28d4c7df, + 0x15b4ee6f, 0x521494bf, 0x6f74bd0f, 0xdd54611f, 0xe03448af, + 0xa794327f, 0x9af41bcf, 0x18a48c1e, 0x25c4a5ae, 0x6264df7e, + 0x5f04f6ce, 0xed242ade, 0xd044036e, 0x97e479be, 0xaa84500e, + 0x4834505d, 0x755479ed, 0x32f4033d, 0x0f942a8d, 0xbdb4f69d, + 0x80d4df2d, 0xc774a5fd, 0xfa148c4d, 0x78441b9c, 0x4524322c, + 0x028448fc, 0x3fe4614c, 0x8dc4bd5c, 0xb0a494ec, 0xf704ee3c, + 0xca64c78c}, + {0x00000000, 0xb8bc6765, 0xaa09c88b, 0x12b5afee, 0x8f629757, + 0x37def032, 0x256b5fdc, 0x9dd738b9, 0xc5b428ef, 0x7d084f8a, + 0x6fbde064, 0xd7018701, 0x4ad6bfb8, 0xf26ad8dd, 0xe0df7733, + 0x58631056, 0x5019579f, 0xe8a530fa, 0xfa109f14, 0x42acf871, + 0xdf7bc0c8, 0x67c7a7ad, 0x75720843, 0xcdce6f26, 0x95ad7f70, + 0x2d111815, 0x3fa4b7fb, 0x8718d09e, 0x1acfe827, 0xa2738f42, + 0xb0c620ac, 0x087a47c9, 0xa032af3e, 0x188ec85b, 0x0a3b67b5, + 0xb28700d0, 0x2f503869, 0x97ec5f0c, 0x8559f0e2, 0x3de59787, + 0x658687d1, 0xdd3ae0b4, 0xcf8f4f5a, 0x7733283f, 0xeae41086, + 0x525877e3, 0x40edd80d, 0xf851bf68, 0xf02bf8a1, 0x48979fc4, + 0x5a22302a, 0xe29e574f, 0x7f496ff6, 0xc7f50893, 0xd540a77d, + 0x6dfcc018, 0x359fd04e, 0x8d23b72b, 0x9f9618c5, 0x272a7fa0, + 0xbafd4719, 0x0241207c, 0x10f48f92, 0xa848e8f7, 0x9b14583d, + 0x23a83f58, 0x311d90b6, 0x89a1f7d3, 0x1476cf6a, 0xaccaa80f, + 0xbe7f07e1, 0x06c36084, 0x5ea070d2, 0xe61c17b7, 0xf4a9b859, + 0x4c15df3c, 0xd1c2e785, 0x697e80e0, 0x7bcb2f0e, 0xc377486b, + 0xcb0d0fa2, 0x73b168c7, 0x6104c729, 0xd9b8a04c, 0x446f98f5, + 0xfcd3ff90, 0xee66507e, 0x56da371b, 0x0eb9274d, 0xb6054028, + 0xa4b0efc6, 0x1c0c88a3, 0x81dbb01a, 0x3967d77f, 0x2bd27891, + 0x936e1ff4, 0x3b26f703, 0x839a9066, 0x912f3f88, 0x299358ed, + 0xb4446054, 0x0cf80731, 0x1e4da8df, 0xa6f1cfba, 0xfe92dfec, + 0x462eb889, 0x549b1767, 0xec277002, 0x71f048bb, 0xc94c2fde, + 0xdbf98030, 0x6345e755, 0x6b3fa09c, 0xd383c7f9, 0xc1366817, + 0x798a0f72, 0xe45d37cb, 0x5ce150ae, 0x4e54ff40, 0xf6e89825, + 0xae8b8873, 0x1637ef16, 0x048240f8, 0xbc3e279d, 0x21e91f24, + 0x99557841, 0x8be0d7af, 0x335cb0ca, 0xed59b63b, 0x55e5d15e, + 0x47507eb0, 0xffec19d5, 0x623b216c, 0xda874609, 0xc832e9e7, + 0x708e8e82, 0x28ed9ed4, 0x9051f9b1, 0x82e4565f, 0x3a58313a, + 0xa78f0983, 0x1f336ee6, 0x0d86c108, 0xb53aa66d, 0xbd40e1a4, + 0x05fc86c1, 0x1749292f, 0xaff54e4a, 0x322276f3, 0x8a9e1196, + 0x982bbe78, 0x2097d91d, 0x78f4c94b, 0xc048ae2e, 0xd2fd01c0, + 0x6a4166a5, 0xf7965e1c, 0x4f2a3979, 0x5d9f9697, 0xe523f1f2, + 0x4d6b1905, 0xf5d77e60, 0xe762d18e, 0x5fdeb6eb, 0xc2098e52, + 0x7ab5e937, 0x680046d9, 0xd0bc21bc, 0x88df31ea, 0x3063568f, + 0x22d6f961, 0x9a6a9e04, 0x07bda6bd, 0xbf01c1d8, 0xadb46e36, + 0x15080953, 0x1d724e9a, 0xa5ce29ff, 0xb77b8611, 0x0fc7e174, + 0x9210d9cd, 0x2aacbea8, 0x38191146, 0x80a57623, 0xd8c66675, + 0x607a0110, 0x72cfaefe, 0xca73c99b, 0x57a4f122, 0xef189647, + 0xfdad39a9, 0x45115ecc, 0x764dee06, 0xcef18963, 0xdc44268d, + 0x64f841e8, 0xf92f7951, 0x41931e34, 0x5326b1da, 0xeb9ad6bf, + 0xb3f9c6e9, 0x0b45a18c, 0x19f00e62, 0xa14c6907, 0x3c9b51be, + 0x842736db, 0x96929935, 0x2e2efe50, 0x2654b999, 0x9ee8defc, + 0x8c5d7112, 0x34e11677, 0xa9362ece, 0x118a49ab, 0x033fe645, + 0xbb838120, 0xe3e09176, 0x5b5cf613, 0x49e959fd, 0xf1553e98, + 0x6c820621, 0xd43e6144, 0xc68bceaa, 0x7e37a9cf, 0xd67f4138, + 0x6ec3265d, 0x7c7689b3, 0xc4caeed6, 0x591dd66f, 0xe1a1b10a, + 0xf3141ee4, 0x4ba87981, 0x13cb69d7, 0xab770eb2, 0xb9c2a15c, + 0x017ec639, 0x9ca9fe80, 0x241599e5, 0x36a0360b, 0x8e1c516e, + 0x866616a7, 0x3eda71c2, 0x2c6fde2c, 0x94d3b949, 0x090481f0, + 0xb1b8e695, 0xa30d497b, 0x1bb12e1e, 0x43d23e48, 0xfb6e592d, + 0xe9dbf6c3, 0x516791a6, 0xccb0a91f, 0x740cce7a, 0x66b96194, + 0xde0506f1}, + {0x00000000, 0x01c26a37, 0x0384d46e, 0x0246be59, 0x0709a8dc, + 0x06cbc2eb, 0x048d7cb2, 0x054f1685, 0x0e1351b8, 0x0fd13b8f, + 0x0d9785d6, 0x0c55efe1, 0x091af964, 0x08d89353, 0x0a9e2d0a, + 0x0b5c473d, 0x1c26a370, 0x1de4c947, 0x1fa2771e, 0x1e601d29, + 0x1b2f0bac, 0x1aed619b, 0x18abdfc2, 0x1969b5f5, 0x1235f2c8, + 0x13f798ff, 0x11b126a6, 0x10734c91, 0x153c5a14, 0x14fe3023, + 0x16b88e7a, 0x177ae44d, 0x384d46e0, 0x398f2cd7, 0x3bc9928e, + 0x3a0bf8b9, 0x3f44ee3c, 0x3e86840b, 0x3cc03a52, 0x3d025065, + 0x365e1758, 0x379c7d6f, 0x35dac336, 0x3418a901, 0x3157bf84, + 0x3095d5b3, 0x32d36bea, 0x331101dd, 0x246be590, 0x25a98fa7, + 0x27ef31fe, 0x262d5bc9, 0x23624d4c, 0x22a0277b, 0x20e69922, + 0x2124f315, 0x2a78b428, 0x2bbade1f, 0x29fc6046, 0x283e0a71, + 0x2d711cf4, 0x2cb376c3, 0x2ef5c89a, 0x2f37a2ad, 0x709a8dc0, + 0x7158e7f7, 0x731e59ae, 0x72dc3399, 0x7793251c, 0x76514f2b, + 0x7417f172, 0x75d59b45, 0x7e89dc78, 0x7f4bb64f, 0x7d0d0816, + 0x7ccf6221, 0x798074a4, 0x78421e93, 0x7a04a0ca, 0x7bc6cafd, + 0x6cbc2eb0, 0x6d7e4487, 0x6f38fade, 0x6efa90e9, 0x6bb5866c, + 0x6a77ec5b, 0x68315202, 0x69f33835, 0x62af7f08, 0x636d153f, + 0x612bab66, 0x60e9c151, 0x65a6d7d4, 0x6464bde3, 0x662203ba, + 0x67e0698d, 0x48d7cb20, 0x4915a117, 0x4b531f4e, 0x4a917579, + 0x4fde63fc, 0x4e1c09cb, 0x4c5ab792, 0x4d98dda5, 0x46c49a98, + 0x4706f0af, 0x45404ef6, 0x448224c1, 0x41cd3244, 0x400f5873, + 0x4249e62a, 0x438b8c1d, 0x54f16850, 0x55330267, 0x5775bc3e, + 0x56b7d609, 0x53f8c08c, 0x523aaabb, 0x507c14e2, 0x51be7ed5, + 0x5ae239e8, 0x5b2053df, 0x5966ed86, 0x58a487b1, 0x5deb9134, + 0x5c29fb03, 0x5e6f455a, 0x5fad2f6d, 0xe1351b80, 0xe0f771b7, + 0xe2b1cfee, 0xe373a5d9, 0xe63cb35c, 0xe7fed96b, 0xe5b86732, + 0xe47a0d05, 0xef264a38, 0xeee4200f, 0xeca29e56, 0xed60f461, + 0xe82fe2e4, 0xe9ed88d3, 0xebab368a, 0xea695cbd, 0xfd13b8f0, + 0xfcd1d2c7, 0xfe976c9e, 0xff5506a9, 0xfa1a102c, 0xfbd87a1b, + 0xf99ec442, 0xf85cae75, 0xf300e948, 0xf2c2837f, 0xf0843d26, + 0xf1465711, 0xf4094194, 0xf5cb2ba3, 0xf78d95fa, 0xf64fffcd, + 0xd9785d60, 0xd8ba3757, 0xdafc890e, 0xdb3ee339, 0xde71f5bc, + 0xdfb39f8b, 0xddf521d2, 0xdc374be5, 0xd76b0cd8, 0xd6a966ef, + 0xd4efd8b6, 0xd52db281, 0xd062a404, 0xd1a0ce33, 0xd3e6706a, + 0xd2241a5d, 0xc55efe10, 0xc49c9427, 0xc6da2a7e, 0xc7184049, + 0xc25756cc, 0xc3953cfb, 0xc1d382a2, 0xc011e895, 0xcb4dafa8, + 0xca8fc59f, 0xc8c97bc6, 0xc90b11f1, 0xcc440774, 0xcd866d43, + 0xcfc0d31a, 0xce02b92d, 0x91af9640, 0x906dfc77, 0x922b422e, + 0x93e92819, 0x96a63e9c, 0x976454ab, 0x9522eaf2, 0x94e080c5, + 0x9fbcc7f8, 0x9e7eadcf, 0x9c381396, 0x9dfa79a1, 0x98b56f24, + 0x99770513, 0x9b31bb4a, 0x9af3d17d, 0x8d893530, 0x8c4b5f07, + 0x8e0de15e, 0x8fcf8b69, 0x8a809dec, 0x8b42f7db, 0x89044982, + 0x88c623b5, 0x839a6488, 0x82580ebf, 0x801eb0e6, 0x81dcdad1, + 0x8493cc54, 0x8551a663, 0x8717183a, 0x86d5720d, 0xa9e2d0a0, + 0xa820ba97, 0xaa6604ce, 0xaba46ef9, 0xaeeb787c, 0xaf29124b, + 0xad6fac12, 0xacadc625, 0xa7f18118, 0xa633eb2f, 0xa4755576, + 0xa5b73f41, 0xa0f829c4, 0xa13a43f3, 0xa37cfdaa, 0xa2be979d, + 0xb5c473d0, 0xb40619e7, 0xb640a7be, 0xb782cd89, 0xb2cddb0c, + 0xb30fb13b, 0xb1490f62, 0xb08b6555, 0xbbd72268, 0xba15485f, + 0xb853f606, 0xb9919c31, 0xbcde8ab4, 0xbd1ce083, 0xbf5a5eda, + 0xbe9834ed}, + {0x00000000, 0x191b3141, 0x32366282, 0x2b2d53c3, 0x646cc504, + 0x7d77f445, 0x565aa786, 0x4f4196c7, 0xc8d98a08, 0xd1c2bb49, + 0xfaefe88a, 0xe3f4d9cb, 0xacb54f0c, 0xb5ae7e4d, 0x9e832d8e, + 0x87981ccf, 0x4ac21251, 0x53d92310, 0x78f470d3, 0x61ef4192, + 0x2eaed755, 0x37b5e614, 0x1c98b5d7, 0x05838496, 0x821b9859, + 0x9b00a918, 0xb02dfadb, 0xa936cb9a, 0xe6775d5d, 0xff6c6c1c, + 0xd4413fdf, 0xcd5a0e9e, 0x958424a2, 0x8c9f15e3, 0xa7b24620, + 0xbea97761, 0xf1e8e1a6, 0xe8f3d0e7, 0xc3de8324, 0xdac5b265, + 0x5d5daeaa, 0x44469feb, 0x6f6bcc28, 0x7670fd69, 0x39316bae, + 0x202a5aef, 0x0b07092c, 0x121c386d, 0xdf4636f3, 0xc65d07b2, + 0xed705471, 0xf46b6530, 0xbb2af3f7, 0xa231c2b6, 0x891c9175, + 0x9007a034, 0x179fbcfb, 0x0e848dba, 0x25a9de79, 0x3cb2ef38, + 0x73f379ff, 0x6ae848be, 0x41c51b7d, 0x58de2a3c, 0xf0794f05, + 0xe9627e44, 0xc24f2d87, 0xdb541cc6, 0x94158a01, 0x8d0ebb40, + 0xa623e883, 0xbf38d9c2, 0x38a0c50d, 0x21bbf44c, 0x0a96a78f, + 0x138d96ce, 0x5ccc0009, 0x45d73148, 0x6efa628b, 0x77e153ca, + 0xbabb5d54, 0xa3a06c15, 0x888d3fd6, 0x91960e97, 0xded79850, + 0xc7cca911, 0xece1fad2, 0xf5facb93, 0x7262d75c, 0x6b79e61d, + 0x4054b5de, 0x594f849f, 0x160e1258, 0x0f152319, 0x243870da, + 0x3d23419b, 0x65fd6ba7, 0x7ce65ae6, 0x57cb0925, 0x4ed03864, + 0x0191aea3, 0x188a9fe2, 0x33a7cc21, 0x2abcfd60, 0xad24e1af, + 0xb43fd0ee, 0x9f12832d, 0x8609b26c, 0xc94824ab, 0xd05315ea, + 0xfb7e4629, 0xe2657768, 0x2f3f79f6, 0x362448b7, 0x1d091b74, + 0x04122a35, 0x4b53bcf2, 0x52488db3, 0x7965de70, 0x607eef31, + 0xe7e6f3fe, 0xfefdc2bf, 0xd5d0917c, 0xcccba03d, 0x838a36fa, + 0x9a9107bb, 0xb1bc5478, 0xa8a76539, 0x3b83984b, 0x2298a90a, + 0x09b5fac9, 0x10aecb88, 0x5fef5d4f, 0x46f46c0e, 0x6dd93fcd, + 0x74c20e8c, 0xf35a1243, 0xea412302, 0xc16c70c1, 0xd8774180, + 0x9736d747, 0x8e2de606, 0xa500b5c5, 0xbc1b8484, 0x71418a1a, + 0x685abb5b, 0x4377e898, 0x5a6cd9d9, 0x152d4f1e, 0x0c367e5f, + 0x271b2d9c, 0x3e001cdd, 0xb9980012, 0xa0833153, 0x8bae6290, + 0x92b553d1, 0xddf4c516, 0xc4eff457, 0xefc2a794, 0xf6d996d5, + 0xae07bce9, 0xb71c8da8, 0x9c31de6b, 0x852aef2a, 0xca6b79ed, + 0xd37048ac, 0xf85d1b6f, 0xe1462a2e, 0x66de36e1, 0x7fc507a0, + 0x54e85463, 0x4df36522, 0x02b2f3e5, 0x1ba9c2a4, 0x30849167, + 0x299fa026, 0xe4c5aeb8, 0xfdde9ff9, 0xd6f3cc3a, 0xcfe8fd7b, + 0x80a96bbc, 0x99b25afd, 0xb29f093e, 0xab84387f, 0x2c1c24b0, + 0x350715f1, 0x1e2a4632, 0x07317773, 0x4870e1b4, 0x516bd0f5, + 0x7a468336, 0x635db277, 0xcbfad74e, 0xd2e1e60f, 0xf9ccb5cc, + 0xe0d7848d, 0xaf96124a, 0xb68d230b, 0x9da070c8, 0x84bb4189, + 0x03235d46, 0x1a386c07, 0x31153fc4, 0x280e0e85, 0x674f9842, + 0x7e54a903, 0x5579fac0, 0x4c62cb81, 0x8138c51f, 0x9823f45e, + 0xb30ea79d, 0xaa1596dc, 0xe554001b, 0xfc4f315a, 0xd7626299, + 0xce7953d8, 0x49e14f17, 0x50fa7e56, 0x7bd72d95, 0x62cc1cd4, + 0x2d8d8a13, 0x3496bb52, 0x1fbbe891, 0x06a0d9d0, 0x5e7ef3ec, + 0x4765c2ad, 0x6c48916e, 0x7553a02f, 0x3a1236e8, 0x230907a9, + 0x0824546a, 0x113f652b, 0x96a779e4, 0x8fbc48a5, 0xa4911b66, + 0xbd8a2a27, 0xf2cbbce0, 0xebd08da1, 0xc0fdde62, 0xd9e6ef23, + 0x14bce1bd, 0x0da7d0fc, 0x268a833f, 0x3f91b27e, 0x70d024b9, + 0x69cb15f8, 0x42e6463b, 0x5bfd777a, 0xdc656bb5, 0xc57e5af4, + 0xee530937, 0xf7483876, 0xb809aeb1, 0xa1129ff0, 0x8a3fcc33, + 0x9324fd72}, + {0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, + 0x706af48f, 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, + 0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, + 0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, + 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856, + 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9, + 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, + 0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, + 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, + 0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a, + 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599, + 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, + 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, + 0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, + 0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e, + 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01, + 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed, + 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950, + 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, + 0xfbd44c65, 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, + 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, + 0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5, + 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010, + 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, + 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, + 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, + 0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615, + 0x73dc1683, 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8, + 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 0xf00f9344, + 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, + 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, + 0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, + 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, + 0xa6bc5767, 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c, + 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef, + 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, + 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, + 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, + 0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c, + 0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713, + 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b, + 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242, + 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, + 0x18b74777, 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, + 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, 0xa00ae278, + 0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7, + 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66, + 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, + 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, + 0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, + 0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, + 0x2d02ef8d}}; + +local const z_word_t FAR crc_braid_big_table[][256] = { + {0x0000000000000000, 0x9630077700000000, 0x2c610eee00000000, + 0xba51099900000000, 0x19c46d0700000000, 0x8ff46a7000000000, + 0x35a563e900000000, 0xa395649e00000000, 0x3288db0e00000000, + 0xa4b8dc7900000000, 0x1ee9d5e000000000, 0x88d9d29700000000, + 0x2b4cb60900000000, 0xbd7cb17e00000000, 0x072db8e700000000, + 0x911dbf9000000000, 0x6410b71d00000000, 0xf220b06a00000000, + 0x4871b9f300000000, 0xde41be8400000000, 0x7dd4da1a00000000, + 0xebe4dd6d00000000, 0x51b5d4f400000000, 0xc785d38300000000, + 0x56986c1300000000, 0xc0a86b6400000000, 0x7af962fd00000000, + 0xecc9658a00000000, 0x4f5c011400000000, 0xd96c066300000000, + 0x633d0ffa00000000, 0xf50d088d00000000, 0xc8206e3b00000000, + 0x5e10694c00000000, 0xe44160d500000000, 0x727167a200000000, + 0xd1e4033c00000000, 0x47d4044b00000000, 0xfd850dd200000000, + 0x6bb50aa500000000, 0xfaa8b53500000000, 0x6c98b24200000000, + 0xd6c9bbdb00000000, 0x40f9bcac00000000, 0xe36cd83200000000, + 0x755cdf4500000000, 0xcf0dd6dc00000000, 0x593dd1ab00000000, + 0xac30d92600000000, 0x3a00de5100000000, 0x8051d7c800000000, + 0x1661d0bf00000000, 0xb5f4b42100000000, 0x23c4b35600000000, + 0x9995bacf00000000, 0x0fa5bdb800000000, 0x9eb8022800000000, + 0x0888055f00000000, 0xb2d90cc600000000, 0x24e90bb100000000, + 0x877c6f2f00000000, 0x114c685800000000, 0xab1d61c100000000, + 0x3d2d66b600000000, 0x9041dc7600000000, 0x0671db0100000000, + 0xbc20d29800000000, 0x2a10d5ef00000000, 0x8985b17100000000, + 0x1fb5b60600000000, 0xa5e4bf9f00000000, 0x33d4b8e800000000, + 0xa2c9077800000000, 0x34f9000f00000000, 0x8ea8099600000000, + 0x18980ee100000000, 0xbb0d6a7f00000000, 0x2d3d6d0800000000, + 0x976c649100000000, 0x015c63e600000000, 0xf4516b6b00000000, + 0x62616c1c00000000, 0xd830658500000000, 0x4e0062f200000000, + 0xed95066c00000000, 0x7ba5011b00000000, 0xc1f4088200000000, + 0x57c40ff500000000, 0xc6d9b06500000000, 0x50e9b71200000000, + 0xeab8be8b00000000, 0x7c88b9fc00000000, 0xdf1ddd6200000000, + 0x492dda1500000000, 0xf37cd38c00000000, 0x654cd4fb00000000, + 0x5861b24d00000000, 0xce51b53a00000000, 0x7400bca300000000, + 0xe230bbd400000000, 0x41a5df4a00000000, 0xd795d83d00000000, + 0x6dc4d1a400000000, 0xfbf4d6d300000000, 0x6ae9694300000000, + 0xfcd96e3400000000, 0x468867ad00000000, 0xd0b860da00000000, + 0x732d044400000000, 0xe51d033300000000, 0x5f4c0aaa00000000, + 0xc97c0ddd00000000, 0x3c71055000000000, 0xaa41022700000000, + 0x10100bbe00000000, 0x86200cc900000000, 0x25b5685700000000, + 0xb3856f2000000000, 0x09d466b900000000, 0x9fe461ce00000000, + 0x0ef9de5e00000000, 0x98c9d92900000000, 0x2298d0b000000000, + 0xb4a8d7c700000000, 0x173db35900000000, 0x810db42e00000000, + 0x3b5cbdb700000000, 0xad6cbac000000000, 0x2083b8ed00000000, + 0xb6b3bf9a00000000, 0x0ce2b60300000000, 0x9ad2b17400000000, + 0x3947d5ea00000000, 0xaf77d29d00000000, 0x1526db0400000000, + 0x8316dc7300000000, 0x120b63e300000000, 0x843b649400000000, + 0x3e6a6d0d00000000, 0xa85a6a7a00000000, 0x0bcf0ee400000000, + 0x9dff099300000000, 0x27ae000a00000000, 0xb19e077d00000000, + 0x44930ff000000000, 0xd2a3088700000000, 0x68f2011e00000000, + 0xfec2066900000000, 0x5d5762f700000000, 0xcb67658000000000, + 0x71366c1900000000, 0xe7066b6e00000000, 0x761bd4fe00000000, + 0xe02bd38900000000, 0x5a7ada1000000000, 0xcc4add6700000000, + 0x6fdfb9f900000000, 0xf9efbe8e00000000, 0x43beb71700000000, + 0xd58eb06000000000, 0xe8a3d6d600000000, 0x7e93d1a100000000, + 0xc4c2d83800000000, 0x52f2df4f00000000, 0xf167bbd100000000, + 0x6757bca600000000, 0xdd06b53f00000000, 0x4b36b24800000000, + 0xda2b0dd800000000, 0x4c1b0aaf00000000, 0xf64a033600000000, + 0x607a044100000000, 0xc3ef60df00000000, 0x55df67a800000000, + 0xef8e6e3100000000, 0x79be694600000000, 0x8cb361cb00000000, + 0x1a8366bc00000000, 0xa0d26f2500000000, 0x36e2685200000000, + 0x95770ccc00000000, 0x03470bbb00000000, 0xb916022200000000, + 0x2f26055500000000, 0xbe3bbac500000000, 0x280bbdb200000000, + 0x925ab42b00000000, 0x046ab35c00000000, 0xa7ffd7c200000000, + 0x31cfd0b500000000, 0x8b9ed92c00000000, 0x1daede5b00000000, + 0xb0c2649b00000000, 0x26f263ec00000000, 0x9ca36a7500000000, + 0x0a936d0200000000, 0xa906099c00000000, 0x3f360eeb00000000, + 0x8567077200000000, 0x1357000500000000, 0x824abf9500000000, + 0x147ab8e200000000, 0xae2bb17b00000000, 0x381bb60c00000000, + 0x9b8ed29200000000, 0x0dbed5e500000000, 0xb7efdc7c00000000, + 0x21dfdb0b00000000, 0xd4d2d38600000000, 0x42e2d4f100000000, + 0xf8b3dd6800000000, 0x6e83da1f00000000, 0xcd16be8100000000, + 0x5b26b9f600000000, 0xe177b06f00000000, 0x7747b71800000000, + 0xe65a088800000000, 0x706a0fff00000000, 0xca3b066600000000, + 0x5c0b011100000000, 0xff9e658f00000000, 0x69ae62f800000000, + 0xd3ff6b6100000000, 0x45cf6c1600000000, 0x78e20aa000000000, + 0xeed20dd700000000, 0x5483044e00000000, 0xc2b3033900000000, + 0x612667a700000000, 0xf71660d000000000, 0x4d47694900000000, + 0xdb776e3e00000000, 0x4a6ad1ae00000000, 0xdc5ad6d900000000, + 0x660bdf4000000000, 0xf03bd83700000000, 0x53aebca900000000, + 0xc59ebbde00000000, 0x7fcfb24700000000, 0xe9ffb53000000000, + 0x1cf2bdbd00000000, 0x8ac2baca00000000, 0x3093b35300000000, + 0xa6a3b42400000000, 0x0536d0ba00000000, 0x9306d7cd00000000, + 0x2957de5400000000, 0xbf67d92300000000, 0x2e7a66b300000000, + 0xb84a61c400000000, 0x021b685d00000000, 0x942b6f2a00000000, + 0x37be0bb400000000, 0xa18e0cc300000000, 0x1bdf055a00000000, + 0x8def022d00000000}, + {0x0000000000000000, 0x41311b1900000000, 0x8262363200000000, + 0xc3532d2b00000000, 0x04c56c6400000000, 0x45f4777d00000000, + 0x86a75a5600000000, 0xc796414f00000000, 0x088ad9c800000000, + 0x49bbc2d100000000, 0x8ae8effa00000000, 0xcbd9f4e300000000, + 0x0c4fb5ac00000000, 0x4d7eaeb500000000, 0x8e2d839e00000000, + 0xcf1c988700000000, 0x5112c24a00000000, 0x1023d95300000000, + 0xd370f47800000000, 0x9241ef6100000000, 0x55d7ae2e00000000, + 0x14e6b53700000000, 0xd7b5981c00000000, 0x9684830500000000, + 0x59981b8200000000, 0x18a9009b00000000, 0xdbfa2db000000000, + 0x9acb36a900000000, 0x5d5d77e600000000, 0x1c6c6cff00000000, + 0xdf3f41d400000000, 0x9e0e5acd00000000, 0xa224849500000000, + 0xe3159f8c00000000, 0x2046b2a700000000, 0x6177a9be00000000, + 0xa6e1e8f100000000, 0xe7d0f3e800000000, 0x2483dec300000000, + 0x65b2c5da00000000, 0xaaae5d5d00000000, 0xeb9f464400000000, + 0x28cc6b6f00000000, 0x69fd707600000000, 0xae6b313900000000, + 0xef5a2a2000000000, 0x2c09070b00000000, 0x6d381c1200000000, + 0xf33646df00000000, 0xb2075dc600000000, 0x715470ed00000000, + 0x30656bf400000000, 0xf7f32abb00000000, 0xb6c231a200000000, + 0x75911c8900000000, 0x34a0079000000000, 0xfbbc9f1700000000, + 0xba8d840e00000000, 0x79dea92500000000, 0x38efb23c00000000, + 0xff79f37300000000, 0xbe48e86a00000000, 0x7d1bc54100000000, + 0x3c2ade5800000000, 0x054f79f000000000, 0x447e62e900000000, + 0x872d4fc200000000, 0xc61c54db00000000, 0x018a159400000000, + 0x40bb0e8d00000000, 0x83e823a600000000, 0xc2d938bf00000000, + 0x0dc5a03800000000, 0x4cf4bb2100000000, 0x8fa7960a00000000, + 0xce968d1300000000, 0x0900cc5c00000000, 0x4831d74500000000, + 0x8b62fa6e00000000, 0xca53e17700000000, 0x545dbbba00000000, + 0x156ca0a300000000, 0xd63f8d8800000000, 0x970e969100000000, + 0x5098d7de00000000, 0x11a9ccc700000000, 0xd2fae1ec00000000, + 0x93cbfaf500000000, 0x5cd7627200000000, 0x1de6796b00000000, + 0xdeb5544000000000, 0x9f844f5900000000, 0x58120e1600000000, + 0x1923150f00000000, 0xda70382400000000, 0x9b41233d00000000, + 0xa76bfd6500000000, 0xe65ae67c00000000, 0x2509cb5700000000, + 0x6438d04e00000000, 0xa3ae910100000000, 0xe29f8a1800000000, + 0x21cca73300000000, 0x60fdbc2a00000000, 0xafe124ad00000000, + 0xeed03fb400000000, 0x2d83129f00000000, 0x6cb2098600000000, + 0xab2448c900000000, 0xea1553d000000000, 0x29467efb00000000, + 0x687765e200000000, 0xf6793f2f00000000, 0xb748243600000000, + 0x741b091d00000000, 0x352a120400000000, 0xf2bc534b00000000, + 0xb38d485200000000, 0x70de657900000000, 0x31ef7e6000000000, + 0xfef3e6e700000000, 0xbfc2fdfe00000000, 0x7c91d0d500000000, + 0x3da0cbcc00000000, 0xfa368a8300000000, 0xbb07919a00000000, + 0x7854bcb100000000, 0x3965a7a800000000, 0x4b98833b00000000, + 0x0aa9982200000000, 0xc9fab50900000000, 0x88cbae1000000000, + 0x4f5def5f00000000, 0x0e6cf44600000000, 0xcd3fd96d00000000, + 0x8c0ec27400000000, 0x43125af300000000, 0x022341ea00000000, + 0xc1706cc100000000, 0x804177d800000000, 0x47d7369700000000, + 0x06e62d8e00000000, 0xc5b500a500000000, 0x84841bbc00000000, + 0x1a8a417100000000, 0x5bbb5a6800000000, 0x98e8774300000000, + 0xd9d96c5a00000000, 0x1e4f2d1500000000, 0x5f7e360c00000000, + 0x9c2d1b2700000000, 0xdd1c003e00000000, 0x120098b900000000, + 0x533183a000000000, 0x9062ae8b00000000, 0xd153b59200000000, + 0x16c5f4dd00000000, 0x57f4efc400000000, 0x94a7c2ef00000000, + 0xd596d9f600000000, 0xe9bc07ae00000000, 0xa88d1cb700000000, + 0x6bde319c00000000, 0x2aef2a8500000000, 0xed796bca00000000, + 0xac4870d300000000, 0x6f1b5df800000000, 0x2e2a46e100000000, + 0xe136de6600000000, 0xa007c57f00000000, 0x6354e85400000000, + 0x2265f34d00000000, 0xe5f3b20200000000, 0xa4c2a91b00000000, + 0x6791843000000000, 0x26a09f2900000000, 0xb8aec5e400000000, + 0xf99fdefd00000000, 0x3accf3d600000000, 0x7bfde8cf00000000, + 0xbc6ba98000000000, 0xfd5ab29900000000, 0x3e099fb200000000, + 0x7f3884ab00000000, 0xb0241c2c00000000, 0xf115073500000000, + 0x32462a1e00000000, 0x7377310700000000, 0xb4e1704800000000, + 0xf5d06b5100000000, 0x3683467a00000000, 0x77b25d6300000000, + 0x4ed7facb00000000, 0x0fe6e1d200000000, 0xccb5ccf900000000, + 0x8d84d7e000000000, 0x4a1296af00000000, 0x0b238db600000000, + 0xc870a09d00000000, 0x8941bb8400000000, 0x465d230300000000, + 0x076c381a00000000, 0xc43f153100000000, 0x850e0e2800000000, + 0x42984f6700000000, 0x03a9547e00000000, 0xc0fa795500000000, + 0x81cb624c00000000, 0x1fc5388100000000, 0x5ef4239800000000, + 0x9da70eb300000000, 0xdc9615aa00000000, 0x1b0054e500000000, + 0x5a314ffc00000000, 0x996262d700000000, 0xd85379ce00000000, + 0x174fe14900000000, 0x567efa5000000000, 0x952dd77b00000000, + 0xd41ccc6200000000, 0x138a8d2d00000000, 0x52bb963400000000, + 0x91e8bb1f00000000, 0xd0d9a00600000000, 0xecf37e5e00000000, + 0xadc2654700000000, 0x6e91486c00000000, 0x2fa0537500000000, + 0xe836123a00000000, 0xa907092300000000, 0x6a54240800000000, + 0x2b653f1100000000, 0xe479a79600000000, 0xa548bc8f00000000, + 0x661b91a400000000, 0x272a8abd00000000, 0xe0bccbf200000000, + 0xa18dd0eb00000000, 0x62defdc000000000, 0x23efe6d900000000, + 0xbde1bc1400000000, 0xfcd0a70d00000000, 0x3f838a2600000000, + 0x7eb2913f00000000, 0xb924d07000000000, 0xf815cb6900000000, + 0x3b46e64200000000, 0x7a77fd5b00000000, 0xb56b65dc00000000, + 0xf45a7ec500000000, 0x370953ee00000000, 0x763848f700000000, + 0xb1ae09b800000000, 0xf09f12a100000000, 0x33cc3f8a00000000, + 0x72fd249300000000}, + {0x0000000000000000, 0x376ac20100000000, 0x6ed4840300000000, + 0x59be460200000000, 0xdca8090700000000, 0xebc2cb0600000000, + 0xb27c8d0400000000, 0x85164f0500000000, 0xb851130e00000000, + 0x8f3bd10f00000000, 0xd685970d00000000, 0xe1ef550c00000000, + 0x64f91a0900000000, 0x5393d80800000000, 0x0a2d9e0a00000000, + 0x3d475c0b00000000, 0x70a3261c00000000, 0x47c9e41d00000000, + 0x1e77a21f00000000, 0x291d601e00000000, 0xac0b2f1b00000000, + 0x9b61ed1a00000000, 0xc2dfab1800000000, 0xf5b5691900000000, + 0xc8f2351200000000, 0xff98f71300000000, 0xa626b11100000000, + 0x914c731000000000, 0x145a3c1500000000, 0x2330fe1400000000, + 0x7a8eb81600000000, 0x4de47a1700000000, 0xe0464d3800000000, + 0xd72c8f3900000000, 0x8e92c93b00000000, 0xb9f80b3a00000000, + 0x3cee443f00000000, 0x0b84863e00000000, 0x523ac03c00000000, + 0x6550023d00000000, 0x58175e3600000000, 0x6f7d9c3700000000, + 0x36c3da3500000000, 0x01a9183400000000, 0x84bf573100000000, + 0xb3d5953000000000, 0xea6bd33200000000, 0xdd01113300000000, + 0x90e56b2400000000, 0xa78fa92500000000, 0xfe31ef2700000000, + 0xc95b2d2600000000, 0x4c4d622300000000, 0x7b27a02200000000, + 0x2299e62000000000, 0x15f3242100000000, 0x28b4782a00000000, + 0x1fdeba2b00000000, 0x4660fc2900000000, 0x710a3e2800000000, + 0xf41c712d00000000, 0xc376b32c00000000, 0x9ac8f52e00000000, + 0xada2372f00000000, 0xc08d9a7000000000, 0xf7e7587100000000, + 0xae591e7300000000, 0x9933dc7200000000, 0x1c25937700000000, + 0x2b4f517600000000, 0x72f1177400000000, 0x459bd57500000000, + 0x78dc897e00000000, 0x4fb64b7f00000000, 0x16080d7d00000000, + 0x2162cf7c00000000, 0xa474807900000000, 0x931e427800000000, + 0xcaa0047a00000000, 0xfdcac67b00000000, 0xb02ebc6c00000000, + 0x87447e6d00000000, 0xdefa386f00000000, 0xe990fa6e00000000, + 0x6c86b56b00000000, 0x5bec776a00000000, 0x0252316800000000, + 0x3538f36900000000, 0x087faf6200000000, 0x3f156d6300000000, + 0x66ab2b6100000000, 0x51c1e96000000000, 0xd4d7a66500000000, + 0xe3bd646400000000, 0xba03226600000000, 0x8d69e06700000000, + 0x20cbd74800000000, 0x17a1154900000000, 0x4e1f534b00000000, + 0x7975914a00000000, 0xfc63de4f00000000, 0xcb091c4e00000000, + 0x92b75a4c00000000, 0xa5dd984d00000000, 0x989ac44600000000, + 0xaff0064700000000, 0xf64e404500000000, 0xc124824400000000, + 0x4432cd4100000000, 0x73580f4000000000, 0x2ae6494200000000, + 0x1d8c8b4300000000, 0x5068f15400000000, 0x6702335500000000, + 0x3ebc755700000000, 0x09d6b75600000000, 0x8cc0f85300000000, + 0xbbaa3a5200000000, 0xe2147c5000000000, 0xd57ebe5100000000, + 0xe839e25a00000000, 0xdf53205b00000000, 0x86ed665900000000, + 0xb187a45800000000, 0x3491eb5d00000000, 0x03fb295c00000000, + 0x5a456f5e00000000, 0x6d2fad5f00000000, 0x801b35e100000000, + 0xb771f7e000000000, 0xeecfb1e200000000, 0xd9a573e300000000, + 0x5cb33ce600000000, 0x6bd9fee700000000, 0x3267b8e500000000, + 0x050d7ae400000000, 0x384a26ef00000000, 0x0f20e4ee00000000, + 0x569ea2ec00000000, 0x61f460ed00000000, 0xe4e22fe800000000, + 0xd388ede900000000, 0x8a36abeb00000000, 0xbd5c69ea00000000, + 0xf0b813fd00000000, 0xc7d2d1fc00000000, 0x9e6c97fe00000000, + 0xa90655ff00000000, 0x2c101afa00000000, 0x1b7ad8fb00000000, + 0x42c49ef900000000, 0x75ae5cf800000000, 0x48e900f300000000, + 0x7f83c2f200000000, 0x263d84f000000000, 0x115746f100000000, + 0x944109f400000000, 0xa32bcbf500000000, 0xfa958df700000000, + 0xcdff4ff600000000, 0x605d78d900000000, 0x5737bad800000000, + 0x0e89fcda00000000, 0x39e33edb00000000, 0xbcf571de00000000, + 0x8b9fb3df00000000, 0xd221f5dd00000000, 0xe54b37dc00000000, + 0xd80c6bd700000000, 0xef66a9d600000000, 0xb6d8efd400000000, + 0x81b22dd500000000, 0x04a462d000000000, 0x33cea0d100000000, + 0x6a70e6d300000000, 0x5d1a24d200000000, 0x10fe5ec500000000, + 0x27949cc400000000, 0x7e2adac600000000, 0x494018c700000000, + 0xcc5657c200000000, 0xfb3c95c300000000, 0xa282d3c100000000, + 0x95e811c000000000, 0xa8af4dcb00000000, 0x9fc58fca00000000, + 0xc67bc9c800000000, 0xf1110bc900000000, 0x740744cc00000000, + 0x436d86cd00000000, 0x1ad3c0cf00000000, 0x2db902ce00000000, + 0x4096af9100000000, 0x77fc6d9000000000, 0x2e422b9200000000, + 0x1928e99300000000, 0x9c3ea69600000000, 0xab54649700000000, + 0xf2ea229500000000, 0xc580e09400000000, 0xf8c7bc9f00000000, + 0xcfad7e9e00000000, 0x9613389c00000000, 0xa179fa9d00000000, + 0x246fb59800000000, 0x1305779900000000, 0x4abb319b00000000, + 0x7dd1f39a00000000, 0x3035898d00000000, 0x075f4b8c00000000, + 0x5ee10d8e00000000, 0x698bcf8f00000000, 0xec9d808a00000000, + 0xdbf7428b00000000, 0x8249048900000000, 0xb523c68800000000, + 0x88649a8300000000, 0xbf0e588200000000, 0xe6b01e8000000000, + 0xd1dadc8100000000, 0x54cc938400000000, 0x63a6518500000000, + 0x3a18178700000000, 0x0d72d58600000000, 0xa0d0e2a900000000, + 0x97ba20a800000000, 0xce0466aa00000000, 0xf96ea4ab00000000, + 0x7c78ebae00000000, 0x4b1229af00000000, 0x12ac6fad00000000, + 0x25c6adac00000000, 0x1881f1a700000000, 0x2feb33a600000000, + 0x765575a400000000, 0x413fb7a500000000, 0xc429f8a000000000, + 0xf3433aa100000000, 0xaafd7ca300000000, 0x9d97bea200000000, + 0xd073c4b500000000, 0xe71906b400000000, 0xbea740b600000000, + 0x89cd82b700000000, 0x0cdbcdb200000000, 0x3bb10fb300000000, + 0x620f49b100000000, 0x55658bb000000000, 0x6822d7bb00000000, + 0x5f4815ba00000000, 0x06f653b800000000, 0x319c91b900000000, + 0xb48adebc00000000, 0x83e01cbd00000000, 0xda5e5abf00000000, + 0xed3498be00000000}, + {0x0000000000000000, 0x6567bcb800000000, 0x8bc809aa00000000, + 0xeeafb51200000000, 0x5797628f00000000, 0x32f0de3700000000, + 0xdc5f6b2500000000, 0xb938d79d00000000, 0xef28b4c500000000, + 0x8a4f087d00000000, 0x64e0bd6f00000000, 0x018701d700000000, + 0xb8bfd64a00000000, 0xddd86af200000000, 0x3377dfe000000000, + 0x5610635800000000, 0x9f57195000000000, 0xfa30a5e800000000, + 0x149f10fa00000000, 0x71f8ac4200000000, 0xc8c07bdf00000000, + 0xada7c76700000000, 0x4308727500000000, 0x266fcecd00000000, + 0x707fad9500000000, 0x1518112d00000000, 0xfbb7a43f00000000, + 0x9ed0188700000000, 0x27e8cf1a00000000, 0x428f73a200000000, + 0xac20c6b000000000, 0xc9477a0800000000, 0x3eaf32a000000000, + 0x5bc88e1800000000, 0xb5673b0a00000000, 0xd00087b200000000, + 0x6938502f00000000, 0x0c5fec9700000000, 0xe2f0598500000000, + 0x8797e53d00000000, 0xd187866500000000, 0xb4e03add00000000, + 0x5a4f8fcf00000000, 0x3f28337700000000, 0x8610e4ea00000000, + 0xe377585200000000, 0x0dd8ed4000000000, 0x68bf51f800000000, + 0xa1f82bf000000000, 0xc49f974800000000, 0x2a30225a00000000, + 0x4f579ee200000000, 0xf66f497f00000000, 0x9308f5c700000000, + 0x7da740d500000000, 0x18c0fc6d00000000, 0x4ed09f3500000000, + 0x2bb7238d00000000, 0xc518969f00000000, 0xa07f2a2700000000, + 0x1947fdba00000000, 0x7c20410200000000, 0x928ff41000000000, + 0xf7e848a800000000, 0x3d58149b00000000, 0x583fa82300000000, + 0xb6901d3100000000, 0xd3f7a18900000000, 0x6acf761400000000, + 0x0fa8caac00000000, 0xe1077fbe00000000, 0x8460c30600000000, + 0xd270a05e00000000, 0xb7171ce600000000, 0x59b8a9f400000000, + 0x3cdf154c00000000, 0x85e7c2d100000000, 0xe0807e6900000000, + 0x0e2fcb7b00000000, 0x6b4877c300000000, 0xa20f0dcb00000000, + 0xc768b17300000000, 0x29c7046100000000, 0x4ca0b8d900000000, + 0xf5986f4400000000, 0x90ffd3fc00000000, 0x7e5066ee00000000, + 0x1b37da5600000000, 0x4d27b90e00000000, 0x284005b600000000, + 0xc6efb0a400000000, 0xa3880c1c00000000, 0x1ab0db8100000000, + 0x7fd7673900000000, 0x9178d22b00000000, 0xf41f6e9300000000, + 0x03f7263b00000000, 0x66909a8300000000, 0x883f2f9100000000, + 0xed58932900000000, 0x546044b400000000, 0x3107f80c00000000, + 0xdfa84d1e00000000, 0xbacff1a600000000, 0xecdf92fe00000000, + 0x89b82e4600000000, 0x67179b5400000000, 0x027027ec00000000, + 0xbb48f07100000000, 0xde2f4cc900000000, 0x3080f9db00000000, + 0x55e7456300000000, 0x9ca03f6b00000000, 0xf9c783d300000000, + 0x176836c100000000, 0x720f8a7900000000, 0xcb375de400000000, + 0xae50e15c00000000, 0x40ff544e00000000, 0x2598e8f600000000, + 0x73888bae00000000, 0x16ef371600000000, 0xf840820400000000, + 0x9d273ebc00000000, 0x241fe92100000000, 0x4178559900000000, + 0xafd7e08b00000000, 0xcab05c3300000000, 0x3bb659ed00000000, + 0x5ed1e55500000000, 0xb07e504700000000, 0xd519ecff00000000, + 0x6c213b6200000000, 0x094687da00000000, 0xe7e932c800000000, + 0x828e8e7000000000, 0xd49eed2800000000, 0xb1f9519000000000, + 0x5f56e48200000000, 0x3a31583a00000000, 0x83098fa700000000, + 0xe66e331f00000000, 0x08c1860d00000000, 0x6da63ab500000000, + 0xa4e140bd00000000, 0xc186fc0500000000, 0x2f29491700000000, + 0x4a4ef5af00000000, 0xf376223200000000, 0x96119e8a00000000, + 0x78be2b9800000000, 0x1dd9972000000000, 0x4bc9f47800000000, + 0x2eae48c000000000, 0xc001fdd200000000, 0xa566416a00000000, + 0x1c5e96f700000000, 0x79392a4f00000000, 0x97969f5d00000000, + 0xf2f123e500000000, 0x05196b4d00000000, 0x607ed7f500000000, + 0x8ed162e700000000, 0xebb6de5f00000000, 0x528e09c200000000, + 0x37e9b57a00000000, 0xd946006800000000, 0xbc21bcd000000000, + 0xea31df8800000000, 0x8f56633000000000, 0x61f9d62200000000, + 0x049e6a9a00000000, 0xbda6bd0700000000, 0xd8c101bf00000000, + 0x366eb4ad00000000, 0x5309081500000000, 0x9a4e721d00000000, + 0xff29cea500000000, 0x11867bb700000000, 0x74e1c70f00000000, + 0xcdd9109200000000, 0xa8beac2a00000000, 0x4611193800000000, + 0x2376a58000000000, 0x7566c6d800000000, 0x10017a6000000000, + 0xfeaecf7200000000, 0x9bc973ca00000000, 0x22f1a45700000000, + 0x479618ef00000000, 0xa939adfd00000000, 0xcc5e114500000000, + 0x06ee4d7600000000, 0x6389f1ce00000000, 0x8d2644dc00000000, + 0xe841f86400000000, 0x51792ff900000000, 0x341e934100000000, + 0xdab1265300000000, 0xbfd69aeb00000000, 0xe9c6f9b300000000, + 0x8ca1450b00000000, 0x620ef01900000000, 0x07694ca100000000, + 0xbe519b3c00000000, 0xdb36278400000000, 0x3599929600000000, + 0x50fe2e2e00000000, 0x99b9542600000000, 0xfcdee89e00000000, + 0x12715d8c00000000, 0x7716e13400000000, 0xce2e36a900000000, + 0xab498a1100000000, 0x45e63f0300000000, 0x208183bb00000000, + 0x7691e0e300000000, 0x13f65c5b00000000, 0xfd59e94900000000, + 0x983e55f100000000, 0x2106826c00000000, 0x44613ed400000000, + 0xaace8bc600000000, 0xcfa9377e00000000, 0x38417fd600000000, + 0x5d26c36e00000000, 0xb389767c00000000, 0xd6eecac400000000, + 0x6fd61d5900000000, 0x0ab1a1e100000000, 0xe41e14f300000000, + 0x8179a84b00000000, 0xd769cb1300000000, 0xb20e77ab00000000, + 0x5ca1c2b900000000, 0x39c67e0100000000, 0x80fea99c00000000, + 0xe599152400000000, 0x0b36a03600000000, 0x6e511c8e00000000, + 0xa716668600000000, 0xc271da3e00000000, 0x2cde6f2c00000000, + 0x49b9d39400000000, 0xf081040900000000, 0x95e6b8b100000000, + 0x7b490da300000000, 0x1e2eb11b00000000, 0x483ed24300000000, + 0x2d596efb00000000, 0xc3f6dbe900000000, 0xa691675100000000, + 0x1fa9b0cc00000000, 0x7ace0c7400000000, 0x9461b96600000000, + 0xf10605de00000000}, + {0x0000000000000000, 0xb029603d00000000, 0x6053c07a00000000, + 0xd07aa04700000000, 0xc0a680f500000000, 0x708fe0c800000000, + 0xa0f5408f00000000, 0x10dc20b200000000, 0xc14b703000000000, + 0x7162100d00000000, 0xa118b04a00000000, 0x1131d07700000000, + 0x01edf0c500000000, 0xb1c490f800000000, 0x61be30bf00000000, + 0xd197508200000000, 0x8297e06000000000, 0x32be805d00000000, + 0xe2c4201a00000000, 0x52ed402700000000, 0x4231609500000000, + 0xf21800a800000000, 0x2262a0ef00000000, 0x924bc0d200000000, + 0x43dc905000000000, 0xf3f5f06d00000000, 0x238f502a00000000, + 0x93a6301700000000, 0x837a10a500000000, 0x3353709800000000, + 0xe329d0df00000000, 0x5300b0e200000000, 0x042fc1c100000000, + 0xb406a1fc00000000, 0x647c01bb00000000, 0xd455618600000000, + 0xc489413400000000, 0x74a0210900000000, 0xa4da814e00000000, + 0x14f3e17300000000, 0xc564b1f100000000, 0x754dd1cc00000000, + 0xa537718b00000000, 0x151e11b600000000, 0x05c2310400000000, + 0xb5eb513900000000, 0x6591f17e00000000, 0xd5b8914300000000, + 0x86b821a100000000, 0x3691419c00000000, 0xe6ebe1db00000000, + 0x56c281e600000000, 0x461ea15400000000, 0xf637c16900000000, + 0x264d612e00000000, 0x9664011300000000, 0x47f3519100000000, + 0xf7da31ac00000000, 0x27a091eb00000000, 0x9789f1d600000000, + 0x8755d16400000000, 0x377cb15900000000, 0xe706111e00000000, + 0x572f712300000000, 0x4958f35800000000, 0xf971936500000000, + 0x290b332200000000, 0x9922531f00000000, 0x89fe73ad00000000, + 0x39d7139000000000, 0xe9adb3d700000000, 0x5984d3ea00000000, + 0x8813836800000000, 0x383ae35500000000, 0xe840431200000000, + 0x5869232f00000000, 0x48b5039d00000000, 0xf89c63a000000000, + 0x28e6c3e700000000, 0x98cfa3da00000000, 0xcbcf133800000000, + 0x7be6730500000000, 0xab9cd34200000000, 0x1bb5b37f00000000, + 0x0b6993cd00000000, 0xbb40f3f000000000, 0x6b3a53b700000000, + 0xdb13338a00000000, 0x0a84630800000000, 0xbaad033500000000, + 0x6ad7a37200000000, 0xdafec34f00000000, 0xca22e3fd00000000, + 0x7a0b83c000000000, 0xaa71238700000000, 0x1a5843ba00000000, + 0x4d77329900000000, 0xfd5e52a400000000, 0x2d24f2e300000000, + 0x9d0d92de00000000, 0x8dd1b26c00000000, 0x3df8d25100000000, + 0xed82721600000000, 0x5dab122b00000000, 0x8c3c42a900000000, + 0x3c15229400000000, 0xec6f82d300000000, 0x5c46e2ee00000000, + 0x4c9ac25c00000000, 0xfcb3a26100000000, 0x2cc9022600000000, + 0x9ce0621b00000000, 0xcfe0d2f900000000, 0x7fc9b2c400000000, + 0xafb3128300000000, 0x1f9a72be00000000, 0x0f46520c00000000, + 0xbf6f323100000000, 0x6f15927600000000, 0xdf3cf24b00000000, + 0x0eaba2c900000000, 0xbe82c2f400000000, 0x6ef862b300000000, + 0xded1028e00000000, 0xce0d223c00000000, 0x7e24420100000000, + 0xae5ee24600000000, 0x1e77827b00000000, 0x92b0e6b100000000, + 0x2299868c00000000, 0xf2e326cb00000000, 0x42ca46f600000000, + 0x5216664400000000, 0xe23f067900000000, 0x3245a63e00000000, + 0x826cc60300000000, 0x53fb968100000000, 0xe3d2f6bc00000000, + 0x33a856fb00000000, 0x838136c600000000, 0x935d167400000000, + 0x2374764900000000, 0xf30ed60e00000000, 0x4327b63300000000, + 0x102706d100000000, 0xa00e66ec00000000, 0x7074c6ab00000000, + 0xc05da69600000000, 0xd081862400000000, 0x60a8e61900000000, + 0xb0d2465e00000000, 0x00fb266300000000, 0xd16c76e100000000, + 0x614516dc00000000, 0xb13fb69b00000000, 0x0116d6a600000000, + 0x11caf61400000000, 0xa1e3962900000000, 0x7199366e00000000, + 0xc1b0565300000000, 0x969f277000000000, 0x26b6474d00000000, + 0xf6cce70a00000000, 0x46e5873700000000, 0x5639a78500000000, + 0xe610c7b800000000, 0x366a67ff00000000, 0x864307c200000000, + 0x57d4574000000000, 0xe7fd377d00000000, 0x3787973a00000000, + 0x87aef70700000000, 0x9772d7b500000000, 0x275bb78800000000, + 0xf72117cf00000000, 0x470877f200000000, 0x1408c71000000000, + 0xa421a72d00000000, 0x745b076a00000000, 0xc472675700000000, + 0xd4ae47e500000000, 0x648727d800000000, 0xb4fd879f00000000, + 0x04d4e7a200000000, 0xd543b72000000000, 0x656ad71d00000000, + 0xb510775a00000000, 0x0539176700000000, 0x15e537d500000000, + 0xa5cc57e800000000, 0x75b6f7af00000000, 0xc59f979200000000, + 0xdbe815e900000000, 0x6bc175d400000000, 0xbbbbd59300000000, + 0x0b92b5ae00000000, 0x1b4e951c00000000, 0xab67f52100000000, + 0x7b1d556600000000, 0xcb34355b00000000, 0x1aa365d900000000, + 0xaa8a05e400000000, 0x7af0a5a300000000, 0xcad9c59e00000000, + 0xda05e52c00000000, 0x6a2c851100000000, 0xba56255600000000, + 0x0a7f456b00000000, 0x597ff58900000000, 0xe95695b400000000, + 0x392c35f300000000, 0x890555ce00000000, 0x99d9757c00000000, + 0x29f0154100000000, 0xf98ab50600000000, 0x49a3d53b00000000, + 0x983485b900000000, 0x281de58400000000, 0xf86745c300000000, + 0x484e25fe00000000, 0x5892054c00000000, 0xe8bb657100000000, + 0x38c1c53600000000, 0x88e8a50b00000000, 0xdfc7d42800000000, + 0x6feeb41500000000, 0xbf94145200000000, 0x0fbd746f00000000, + 0x1f6154dd00000000, 0xaf4834e000000000, 0x7f3294a700000000, + 0xcf1bf49a00000000, 0x1e8ca41800000000, 0xaea5c42500000000, + 0x7edf646200000000, 0xcef6045f00000000, 0xde2a24ed00000000, + 0x6e0344d000000000, 0xbe79e49700000000, 0x0e5084aa00000000, + 0x5d50344800000000, 0xed79547500000000, 0x3d03f43200000000, + 0x8d2a940f00000000, 0x9df6b4bd00000000, 0x2ddfd48000000000, + 0xfda574c700000000, 0x4d8c14fa00000000, 0x9c1b447800000000, + 0x2c32244500000000, 0xfc48840200000000, 0x4c61e43f00000000, + 0x5cbdc48d00000000, 0xec94a4b000000000, 0x3cee04f700000000, + 0x8cc764ca00000000}, + {0x0000000000000000, 0xa5d35ccb00000000, 0x0ba1c84d00000000, + 0xae72948600000000, 0x1642919b00000000, 0xb391cd5000000000, + 0x1de359d600000000, 0xb830051d00000000, 0x6d8253ec00000000, + 0xc8510f2700000000, 0x66239ba100000000, 0xc3f0c76a00000000, + 0x7bc0c27700000000, 0xde139ebc00000000, 0x70610a3a00000000, + 0xd5b256f100000000, 0x9b02d60300000000, 0x3ed18ac800000000, + 0x90a31e4e00000000, 0x3570428500000000, 0x8d40479800000000, + 0x28931b5300000000, 0x86e18fd500000000, 0x2332d31e00000000, + 0xf68085ef00000000, 0x5353d92400000000, 0xfd214da200000000, + 0x58f2116900000000, 0xe0c2147400000000, 0x451148bf00000000, + 0xeb63dc3900000000, 0x4eb080f200000000, 0x3605ac0700000000, + 0x93d6f0cc00000000, 0x3da4644a00000000, 0x9877388100000000, + 0x20473d9c00000000, 0x8594615700000000, 0x2be6f5d100000000, + 0x8e35a91a00000000, 0x5b87ffeb00000000, 0xfe54a32000000000, + 0x502637a600000000, 0xf5f56b6d00000000, 0x4dc56e7000000000, + 0xe81632bb00000000, 0x4664a63d00000000, 0xe3b7faf600000000, + 0xad077a0400000000, 0x08d426cf00000000, 0xa6a6b24900000000, + 0x0375ee8200000000, 0xbb45eb9f00000000, 0x1e96b75400000000, + 0xb0e423d200000000, 0x15377f1900000000, 0xc08529e800000000, + 0x6556752300000000, 0xcb24e1a500000000, 0x6ef7bd6e00000000, + 0xd6c7b87300000000, 0x7314e4b800000000, 0xdd66703e00000000, + 0x78b52cf500000000, 0x6c0a580f00000000, 0xc9d904c400000000, + 0x67ab904200000000, 0xc278cc8900000000, 0x7a48c99400000000, + 0xdf9b955f00000000, 0x71e901d900000000, 0xd43a5d1200000000, + 0x01880be300000000, 0xa45b572800000000, 0x0a29c3ae00000000, + 0xaffa9f6500000000, 0x17ca9a7800000000, 0xb219c6b300000000, + 0x1c6b523500000000, 0xb9b80efe00000000, 0xf7088e0c00000000, + 0x52dbd2c700000000, 0xfca9464100000000, 0x597a1a8a00000000, + 0xe14a1f9700000000, 0x4499435c00000000, 0xeaebd7da00000000, + 0x4f388b1100000000, 0x9a8adde000000000, 0x3f59812b00000000, + 0x912b15ad00000000, 0x34f8496600000000, 0x8cc84c7b00000000, + 0x291b10b000000000, 0x8769843600000000, 0x22bad8fd00000000, + 0x5a0ff40800000000, 0xffdca8c300000000, 0x51ae3c4500000000, + 0xf47d608e00000000, 0x4c4d659300000000, 0xe99e395800000000, + 0x47ecadde00000000, 0xe23ff11500000000, 0x378da7e400000000, + 0x925efb2f00000000, 0x3c2c6fa900000000, 0x99ff336200000000, + 0x21cf367f00000000, 0x841c6ab400000000, 0x2a6efe3200000000, + 0x8fbda2f900000000, 0xc10d220b00000000, 0x64de7ec000000000, + 0xcaacea4600000000, 0x6f7fb68d00000000, 0xd74fb39000000000, + 0x729cef5b00000000, 0xdcee7bdd00000000, 0x793d271600000000, + 0xac8f71e700000000, 0x095c2d2c00000000, 0xa72eb9aa00000000, + 0x02fde56100000000, 0xbacde07c00000000, 0x1f1ebcb700000000, + 0xb16c283100000000, 0x14bf74fa00000000, 0xd814b01e00000000, + 0x7dc7ecd500000000, 0xd3b5785300000000, 0x7666249800000000, + 0xce56218500000000, 0x6b857d4e00000000, 0xc5f7e9c800000000, + 0x6024b50300000000, 0xb596e3f200000000, 0x1045bf3900000000, + 0xbe372bbf00000000, 0x1be4777400000000, 0xa3d4726900000000, + 0x06072ea200000000, 0xa875ba2400000000, 0x0da6e6ef00000000, + 0x4316661d00000000, 0xe6c53ad600000000, 0x48b7ae5000000000, + 0xed64f29b00000000, 0x5554f78600000000, 0xf087ab4d00000000, + 0x5ef53fcb00000000, 0xfb26630000000000, 0x2e9435f100000000, + 0x8b47693a00000000, 0x2535fdbc00000000, 0x80e6a17700000000, + 0x38d6a46a00000000, 0x9d05f8a100000000, 0x33776c2700000000, + 0x96a430ec00000000, 0xee111c1900000000, 0x4bc240d200000000, + 0xe5b0d45400000000, 0x4063889f00000000, 0xf8538d8200000000, + 0x5d80d14900000000, 0xf3f245cf00000000, 0x5621190400000000, + 0x83934ff500000000, 0x2640133e00000000, 0x883287b800000000, + 0x2de1db7300000000, 0x95d1de6e00000000, 0x300282a500000000, + 0x9e70162300000000, 0x3ba34ae800000000, 0x7513ca1a00000000, + 0xd0c096d100000000, 0x7eb2025700000000, 0xdb615e9c00000000, + 0x63515b8100000000, 0xc682074a00000000, 0x68f093cc00000000, + 0xcd23cf0700000000, 0x189199f600000000, 0xbd42c53d00000000, + 0x133051bb00000000, 0xb6e30d7000000000, 0x0ed3086d00000000, + 0xab0054a600000000, 0x0572c02000000000, 0xa0a19ceb00000000, + 0xb41ee81100000000, 0x11cdb4da00000000, 0xbfbf205c00000000, + 0x1a6c7c9700000000, 0xa25c798a00000000, 0x078f254100000000, + 0xa9fdb1c700000000, 0x0c2eed0c00000000, 0xd99cbbfd00000000, + 0x7c4fe73600000000, 0xd23d73b000000000, 0x77ee2f7b00000000, + 0xcfde2a6600000000, 0x6a0d76ad00000000, 0xc47fe22b00000000, + 0x61acbee000000000, 0x2f1c3e1200000000, 0x8acf62d900000000, + 0x24bdf65f00000000, 0x816eaa9400000000, 0x395eaf8900000000, + 0x9c8df34200000000, 0x32ff67c400000000, 0x972c3b0f00000000, + 0x429e6dfe00000000, 0xe74d313500000000, 0x493fa5b300000000, + 0xececf97800000000, 0x54dcfc6500000000, 0xf10fa0ae00000000, + 0x5f7d342800000000, 0xfaae68e300000000, 0x821b441600000000, + 0x27c818dd00000000, 0x89ba8c5b00000000, 0x2c69d09000000000, + 0x9459d58d00000000, 0x318a894600000000, 0x9ff81dc000000000, + 0x3a2b410b00000000, 0xef9917fa00000000, 0x4a4a4b3100000000, + 0xe438dfb700000000, 0x41eb837c00000000, 0xf9db866100000000, + 0x5c08daaa00000000, 0xf27a4e2c00000000, 0x57a912e700000000, + 0x1919921500000000, 0xbccacede00000000, 0x12b85a5800000000, + 0xb76b069300000000, 0x0f5b038e00000000, 0xaa885f4500000000, + 0x04facbc300000000, 0xa129970800000000, 0x749bc1f900000000, + 0xd1489d3200000000, 0x7f3a09b400000000, 0xdae9557f00000000, + 0x62d9506200000000, 0xc70a0ca900000000, 0x6978982f00000000, + 0xccabc4e400000000}, + {0x0000000000000000, 0xb40b77a600000000, 0x29119f9700000000, + 0x9d1ae83100000000, 0x13244ff400000000, 0xa72f385200000000, + 0x3a35d06300000000, 0x8e3ea7c500000000, 0x674eef3300000000, + 0xd345989500000000, 0x4e5f70a400000000, 0xfa54070200000000, + 0x746aa0c700000000, 0xc061d76100000000, 0x5d7b3f5000000000, + 0xe97048f600000000, 0xce9cde6700000000, 0x7a97a9c100000000, + 0xe78d41f000000000, 0x5386365600000000, 0xddb8919300000000, + 0x69b3e63500000000, 0xf4a90e0400000000, 0x40a279a200000000, + 0xa9d2315400000000, 0x1dd946f200000000, 0x80c3aec300000000, + 0x34c8d96500000000, 0xbaf67ea000000000, 0x0efd090600000000, + 0x93e7e13700000000, 0x27ec969100000000, 0x9c39bdcf00000000, + 0x2832ca6900000000, 0xb528225800000000, 0x012355fe00000000, + 0x8f1df23b00000000, 0x3b16859d00000000, 0xa60c6dac00000000, + 0x12071a0a00000000, 0xfb7752fc00000000, 0x4f7c255a00000000, + 0xd266cd6b00000000, 0x666dbacd00000000, 0xe8531d0800000000, + 0x5c586aae00000000, 0xc142829f00000000, 0x7549f53900000000, + 0x52a563a800000000, 0xe6ae140e00000000, 0x7bb4fc3f00000000, + 0xcfbf8b9900000000, 0x41812c5c00000000, 0xf58a5bfa00000000, + 0x6890b3cb00000000, 0xdc9bc46d00000000, 0x35eb8c9b00000000, + 0x81e0fb3d00000000, 0x1cfa130c00000000, 0xa8f164aa00000000, + 0x26cfc36f00000000, 0x92c4b4c900000000, 0x0fde5cf800000000, + 0xbbd52b5e00000000, 0x79750b4400000000, 0xcd7e7ce200000000, + 0x506494d300000000, 0xe46fe37500000000, 0x6a5144b000000000, + 0xde5a331600000000, 0x4340db2700000000, 0xf74bac8100000000, + 0x1e3be47700000000, 0xaa3093d100000000, 0x372a7be000000000, + 0x83210c4600000000, 0x0d1fab8300000000, 0xb914dc2500000000, + 0x240e341400000000, 0x900543b200000000, 0xb7e9d52300000000, + 0x03e2a28500000000, 0x9ef84ab400000000, 0x2af33d1200000000, + 0xa4cd9ad700000000, 0x10c6ed7100000000, 0x8ddc054000000000, + 0x39d772e600000000, 0xd0a73a1000000000, 0x64ac4db600000000, + 0xf9b6a58700000000, 0x4dbdd22100000000, 0xc38375e400000000, + 0x7788024200000000, 0xea92ea7300000000, 0x5e999dd500000000, + 0xe54cb68b00000000, 0x5147c12d00000000, 0xcc5d291c00000000, + 0x78565eba00000000, 0xf668f97f00000000, 0x42638ed900000000, + 0xdf7966e800000000, 0x6b72114e00000000, 0x820259b800000000, + 0x36092e1e00000000, 0xab13c62f00000000, 0x1f18b18900000000, + 0x9126164c00000000, 0x252d61ea00000000, 0xb83789db00000000, + 0x0c3cfe7d00000000, 0x2bd068ec00000000, 0x9fdb1f4a00000000, + 0x02c1f77b00000000, 0xb6ca80dd00000000, 0x38f4271800000000, + 0x8cff50be00000000, 0x11e5b88f00000000, 0xa5eecf2900000000, + 0x4c9e87df00000000, 0xf895f07900000000, 0x658f184800000000, + 0xd1846fee00000000, 0x5fbac82b00000000, 0xebb1bf8d00000000, + 0x76ab57bc00000000, 0xc2a0201a00000000, 0xf2ea168800000000, + 0x46e1612e00000000, 0xdbfb891f00000000, 0x6ff0feb900000000, + 0xe1ce597c00000000, 0x55c52eda00000000, 0xc8dfc6eb00000000, + 0x7cd4b14d00000000, 0x95a4f9bb00000000, 0x21af8e1d00000000, + 0xbcb5662c00000000, 0x08be118a00000000, 0x8680b64f00000000, + 0x328bc1e900000000, 0xaf9129d800000000, 0x1b9a5e7e00000000, + 0x3c76c8ef00000000, 0x887dbf4900000000, 0x1567577800000000, + 0xa16c20de00000000, 0x2f52871b00000000, 0x9b59f0bd00000000, + 0x0643188c00000000, 0xb2486f2a00000000, 0x5b3827dc00000000, + 0xef33507a00000000, 0x7229b84b00000000, 0xc622cfed00000000, + 0x481c682800000000, 0xfc171f8e00000000, 0x610df7bf00000000, + 0xd506801900000000, 0x6ed3ab4700000000, 0xdad8dce100000000, + 0x47c234d000000000, 0xf3c9437600000000, 0x7df7e4b300000000, + 0xc9fc931500000000, 0x54e67b2400000000, 0xe0ed0c8200000000, + 0x099d447400000000, 0xbd9633d200000000, 0x208cdbe300000000, + 0x9487ac4500000000, 0x1ab90b8000000000, 0xaeb27c2600000000, + 0x33a8941700000000, 0x87a3e3b100000000, 0xa04f752000000000, + 0x1444028600000000, 0x895eeab700000000, 0x3d559d1100000000, + 0xb36b3ad400000000, 0x07604d7200000000, 0x9a7aa54300000000, + 0x2e71d2e500000000, 0xc7019a1300000000, 0x730aedb500000000, + 0xee10058400000000, 0x5a1b722200000000, 0xd425d5e700000000, + 0x602ea24100000000, 0xfd344a7000000000, 0x493f3dd600000000, + 0x8b9f1dcc00000000, 0x3f946a6a00000000, 0xa28e825b00000000, + 0x1685f5fd00000000, 0x98bb523800000000, 0x2cb0259e00000000, + 0xb1aacdaf00000000, 0x05a1ba0900000000, 0xecd1f2ff00000000, + 0x58da855900000000, 0xc5c06d6800000000, 0x71cb1ace00000000, + 0xfff5bd0b00000000, 0x4bfecaad00000000, 0xd6e4229c00000000, + 0x62ef553a00000000, 0x4503c3ab00000000, 0xf108b40d00000000, + 0x6c125c3c00000000, 0xd8192b9a00000000, 0x56278c5f00000000, + 0xe22cfbf900000000, 0x7f3613c800000000, 0xcb3d646e00000000, + 0x224d2c9800000000, 0x96465b3e00000000, 0x0b5cb30f00000000, + 0xbf57c4a900000000, 0x3169636c00000000, 0x856214ca00000000, + 0x1878fcfb00000000, 0xac738b5d00000000, 0x17a6a00300000000, + 0xa3add7a500000000, 0x3eb73f9400000000, 0x8abc483200000000, + 0x0482eff700000000, 0xb089985100000000, 0x2d93706000000000, + 0x999807c600000000, 0x70e84f3000000000, 0xc4e3389600000000, + 0x59f9d0a700000000, 0xedf2a70100000000, 0x63cc00c400000000, + 0xd7c7776200000000, 0x4add9f5300000000, 0xfed6e8f500000000, + 0xd93a7e6400000000, 0x6d3109c200000000, 0xf02be1f300000000, + 0x4420965500000000, 0xca1e319000000000, 0x7e15463600000000, + 0xe30fae0700000000, 0x5704d9a100000000, 0xbe74915700000000, + 0x0a7fe6f100000000, 0x97650ec000000000, 0x236e796600000000, + 0xad50dea300000000, 0x195ba90500000000, 0x8441413400000000, + 0x304a369200000000}, + {0x0000000000000000, 0x9e00aacc00000000, 0x7d07254200000000, + 0xe3078f8e00000000, 0xfa0e4a8400000000, 0x640ee04800000000, + 0x87096fc600000000, 0x1909c50a00000000, 0xb51be5d300000000, + 0x2b1b4f1f00000000, 0xc81cc09100000000, 0x561c6a5d00000000, + 0x4f15af5700000000, 0xd115059b00000000, 0x32128a1500000000, + 0xac1220d900000000, 0x2b31bb7c00000000, 0xb53111b000000000, + 0x56369e3e00000000, 0xc83634f200000000, 0xd13ff1f800000000, + 0x4f3f5b3400000000, 0xac38d4ba00000000, 0x32387e7600000000, + 0x9e2a5eaf00000000, 0x002af46300000000, 0xe32d7bed00000000, + 0x7d2dd12100000000, 0x6424142b00000000, 0xfa24bee700000000, + 0x1923316900000000, 0x87239ba500000000, 0x566276f900000000, + 0xc862dc3500000000, 0x2b6553bb00000000, 0xb565f97700000000, + 0xac6c3c7d00000000, 0x326c96b100000000, 0xd16b193f00000000, + 0x4f6bb3f300000000, 0xe379932a00000000, 0x7d7939e600000000, + 0x9e7eb66800000000, 0x007e1ca400000000, 0x1977d9ae00000000, + 0x8777736200000000, 0x6470fcec00000000, 0xfa70562000000000, + 0x7d53cd8500000000, 0xe353674900000000, 0x0054e8c700000000, + 0x9e54420b00000000, 0x875d870100000000, 0x195d2dcd00000000, + 0xfa5aa24300000000, 0x645a088f00000000, 0xc848285600000000, + 0x5648829a00000000, 0xb54f0d1400000000, 0x2b4fa7d800000000, + 0x324662d200000000, 0xac46c81e00000000, 0x4f41479000000000, + 0xd141ed5c00000000, 0xedc29d2900000000, 0x73c237e500000000, + 0x90c5b86b00000000, 0x0ec512a700000000, 0x17ccd7ad00000000, + 0x89cc7d6100000000, 0x6acbf2ef00000000, 0xf4cb582300000000, + 0x58d978fa00000000, 0xc6d9d23600000000, 0x25de5db800000000, + 0xbbdef77400000000, 0xa2d7327e00000000, 0x3cd798b200000000, + 0xdfd0173c00000000, 0x41d0bdf000000000, 0xc6f3265500000000, + 0x58f38c9900000000, 0xbbf4031700000000, 0x25f4a9db00000000, + 0x3cfd6cd100000000, 0xa2fdc61d00000000, 0x41fa499300000000, + 0xdffae35f00000000, 0x73e8c38600000000, 0xede8694a00000000, + 0x0eefe6c400000000, 0x90ef4c0800000000, 0x89e6890200000000, + 0x17e623ce00000000, 0xf4e1ac4000000000, 0x6ae1068c00000000, + 0xbba0ebd000000000, 0x25a0411c00000000, 0xc6a7ce9200000000, + 0x58a7645e00000000, 0x41aea15400000000, 0xdfae0b9800000000, + 0x3ca9841600000000, 0xa2a92eda00000000, 0x0ebb0e0300000000, + 0x90bba4cf00000000, 0x73bc2b4100000000, 0xedbc818d00000000, + 0xf4b5448700000000, 0x6ab5ee4b00000000, 0x89b261c500000000, + 0x17b2cb0900000000, 0x909150ac00000000, 0x0e91fa6000000000, + 0xed9675ee00000000, 0x7396df2200000000, 0x6a9f1a2800000000, + 0xf49fb0e400000000, 0x17983f6a00000000, 0x899895a600000000, + 0x258ab57f00000000, 0xbb8a1fb300000000, 0x588d903d00000000, + 0xc68d3af100000000, 0xdf84fffb00000000, 0x4184553700000000, + 0xa283dab900000000, 0x3c83707500000000, 0xda853b5300000000, + 0x4485919f00000000, 0xa7821e1100000000, 0x3982b4dd00000000, + 0x208b71d700000000, 0xbe8bdb1b00000000, 0x5d8c549500000000, + 0xc38cfe5900000000, 0x6f9ede8000000000, 0xf19e744c00000000, + 0x1299fbc200000000, 0x8c99510e00000000, 0x9590940400000000, + 0x0b903ec800000000, 0xe897b14600000000, 0x76971b8a00000000, + 0xf1b4802f00000000, 0x6fb42ae300000000, 0x8cb3a56d00000000, + 0x12b30fa100000000, 0x0bbacaab00000000, 0x95ba606700000000, + 0x76bdefe900000000, 0xe8bd452500000000, 0x44af65fc00000000, + 0xdaafcf3000000000, 0x39a840be00000000, 0xa7a8ea7200000000, + 0xbea12f7800000000, 0x20a185b400000000, 0xc3a60a3a00000000, + 0x5da6a0f600000000, 0x8ce74daa00000000, 0x12e7e76600000000, + 0xf1e068e800000000, 0x6fe0c22400000000, 0x76e9072e00000000, + 0xe8e9ade200000000, 0x0bee226c00000000, 0x95ee88a000000000, + 0x39fca87900000000, 0xa7fc02b500000000, 0x44fb8d3b00000000, + 0xdafb27f700000000, 0xc3f2e2fd00000000, 0x5df2483100000000, + 0xbef5c7bf00000000, 0x20f56d7300000000, 0xa7d6f6d600000000, + 0x39d65c1a00000000, 0xdad1d39400000000, 0x44d1795800000000, + 0x5dd8bc5200000000, 0xc3d8169e00000000, 0x20df991000000000, + 0xbedf33dc00000000, 0x12cd130500000000, 0x8ccdb9c900000000, + 0x6fca364700000000, 0xf1ca9c8b00000000, 0xe8c3598100000000, + 0x76c3f34d00000000, 0x95c47cc300000000, 0x0bc4d60f00000000, + 0x3747a67a00000000, 0xa9470cb600000000, 0x4a40833800000000, + 0xd44029f400000000, 0xcd49ecfe00000000, 0x5349463200000000, + 0xb04ec9bc00000000, 0x2e4e637000000000, 0x825c43a900000000, + 0x1c5ce96500000000, 0xff5b66eb00000000, 0x615bcc2700000000, + 0x7852092d00000000, 0xe652a3e100000000, 0x05552c6f00000000, + 0x9b5586a300000000, 0x1c761d0600000000, 0x8276b7ca00000000, + 0x6171384400000000, 0xff71928800000000, 0xe678578200000000, + 0x7878fd4e00000000, 0x9b7f72c000000000, 0x057fd80c00000000, + 0xa96df8d500000000, 0x376d521900000000, 0xd46add9700000000, + 0x4a6a775b00000000, 0x5363b25100000000, 0xcd63189d00000000, + 0x2e64971300000000, 0xb0643ddf00000000, 0x6125d08300000000, + 0xff257a4f00000000, 0x1c22f5c100000000, 0x82225f0d00000000, + 0x9b2b9a0700000000, 0x052b30cb00000000, 0xe62cbf4500000000, + 0x782c158900000000, 0xd43e355000000000, 0x4a3e9f9c00000000, + 0xa939101200000000, 0x3739bade00000000, 0x2e307fd400000000, + 0xb030d51800000000, 0x53375a9600000000, 0xcd37f05a00000000, + 0x4a146bff00000000, 0xd414c13300000000, 0x37134ebd00000000, + 0xa913e47100000000, 0xb01a217b00000000, 0x2e1a8bb700000000, + 0xcd1d043900000000, 0x531daef500000000, 0xff0f8e2c00000000, + 0x610f24e000000000, 0x8208ab6e00000000, 0x1c0801a200000000, + 0x0501c4a800000000, 0x9b016e6400000000, 0x7806e1ea00000000, + 0xe6064b2600000000}}; + +#else /* W == 4 */ + +local const z_crc_t FAR crc_braid_table[][256] = { + {0x00000000, 0xb8bc6765, 0xaa09c88b, 0x12b5afee, 0x8f629757, + 0x37def032, 0x256b5fdc, 0x9dd738b9, 0xc5b428ef, 0x7d084f8a, + 0x6fbde064, 0xd7018701, 0x4ad6bfb8, 0xf26ad8dd, 0xe0df7733, + 0x58631056, 0x5019579f, 0xe8a530fa, 0xfa109f14, 0x42acf871, + 0xdf7bc0c8, 0x67c7a7ad, 0x75720843, 0xcdce6f26, 0x95ad7f70, + 0x2d111815, 0x3fa4b7fb, 0x8718d09e, 0x1acfe827, 0xa2738f42, + 0xb0c620ac, 0x087a47c9, 0xa032af3e, 0x188ec85b, 0x0a3b67b5, + 0xb28700d0, 0x2f503869, 0x97ec5f0c, 0x8559f0e2, 0x3de59787, + 0x658687d1, 0xdd3ae0b4, 0xcf8f4f5a, 0x7733283f, 0xeae41086, + 0x525877e3, 0x40edd80d, 0xf851bf68, 0xf02bf8a1, 0x48979fc4, + 0x5a22302a, 0xe29e574f, 0x7f496ff6, 0xc7f50893, 0xd540a77d, + 0x6dfcc018, 0x359fd04e, 0x8d23b72b, 0x9f9618c5, 0x272a7fa0, + 0xbafd4719, 0x0241207c, 0x10f48f92, 0xa848e8f7, 0x9b14583d, + 0x23a83f58, 0x311d90b6, 0x89a1f7d3, 0x1476cf6a, 0xaccaa80f, + 0xbe7f07e1, 0x06c36084, 0x5ea070d2, 0xe61c17b7, 0xf4a9b859, + 0x4c15df3c, 0xd1c2e785, 0x697e80e0, 0x7bcb2f0e, 0xc377486b, + 0xcb0d0fa2, 0x73b168c7, 0x6104c729, 0xd9b8a04c, 0x446f98f5, + 0xfcd3ff90, 0xee66507e, 0x56da371b, 0x0eb9274d, 0xb6054028, + 0xa4b0efc6, 0x1c0c88a3, 0x81dbb01a, 0x3967d77f, 0x2bd27891, + 0x936e1ff4, 0x3b26f703, 0x839a9066, 0x912f3f88, 0x299358ed, + 0xb4446054, 0x0cf80731, 0x1e4da8df, 0xa6f1cfba, 0xfe92dfec, + 0x462eb889, 0x549b1767, 0xec277002, 0x71f048bb, 0xc94c2fde, + 0xdbf98030, 0x6345e755, 0x6b3fa09c, 0xd383c7f9, 0xc1366817, + 0x798a0f72, 0xe45d37cb, 0x5ce150ae, 0x4e54ff40, 0xf6e89825, + 0xae8b8873, 0x1637ef16, 0x048240f8, 0xbc3e279d, 0x21e91f24, + 0x99557841, 0x8be0d7af, 0x335cb0ca, 0xed59b63b, 0x55e5d15e, + 0x47507eb0, 0xffec19d5, 0x623b216c, 0xda874609, 0xc832e9e7, + 0x708e8e82, 0x28ed9ed4, 0x9051f9b1, 0x82e4565f, 0x3a58313a, + 0xa78f0983, 0x1f336ee6, 0x0d86c108, 0xb53aa66d, 0xbd40e1a4, + 0x05fc86c1, 0x1749292f, 0xaff54e4a, 0x322276f3, 0x8a9e1196, + 0x982bbe78, 0x2097d91d, 0x78f4c94b, 0xc048ae2e, 0xd2fd01c0, + 0x6a4166a5, 0xf7965e1c, 0x4f2a3979, 0x5d9f9697, 0xe523f1f2, + 0x4d6b1905, 0xf5d77e60, 0xe762d18e, 0x5fdeb6eb, 0xc2098e52, + 0x7ab5e937, 0x680046d9, 0xd0bc21bc, 0x88df31ea, 0x3063568f, + 0x22d6f961, 0x9a6a9e04, 0x07bda6bd, 0xbf01c1d8, 0xadb46e36, + 0x15080953, 0x1d724e9a, 0xa5ce29ff, 0xb77b8611, 0x0fc7e174, + 0x9210d9cd, 0x2aacbea8, 0x38191146, 0x80a57623, 0xd8c66675, + 0x607a0110, 0x72cfaefe, 0xca73c99b, 0x57a4f122, 0xef189647, + 0xfdad39a9, 0x45115ecc, 0x764dee06, 0xcef18963, 0xdc44268d, + 0x64f841e8, 0xf92f7951, 0x41931e34, 0x5326b1da, 0xeb9ad6bf, + 0xb3f9c6e9, 0x0b45a18c, 0x19f00e62, 0xa14c6907, 0x3c9b51be, + 0x842736db, 0x96929935, 0x2e2efe50, 0x2654b999, 0x9ee8defc, + 0x8c5d7112, 0x34e11677, 0xa9362ece, 0x118a49ab, 0x033fe645, + 0xbb838120, 0xe3e09176, 0x5b5cf613, 0x49e959fd, 0xf1553e98, + 0x6c820621, 0xd43e6144, 0xc68bceaa, 0x7e37a9cf, 0xd67f4138, + 0x6ec3265d, 0x7c7689b3, 0xc4caeed6, 0x591dd66f, 0xe1a1b10a, + 0xf3141ee4, 0x4ba87981, 0x13cb69d7, 0xab770eb2, 0xb9c2a15c, + 0x017ec639, 0x9ca9fe80, 0x241599e5, 0x36a0360b, 0x8e1c516e, + 0x866616a7, 0x3eda71c2, 0x2c6fde2c, 0x94d3b949, 0x090481f0, + 0xb1b8e695, 0xa30d497b, 0x1bb12e1e, 0x43d23e48, 0xfb6e592d, + 0xe9dbf6c3, 0x516791a6, 0xccb0a91f, 0x740cce7a, 0x66b96194, + 0xde0506f1}, + {0x00000000, 0x01c26a37, 0x0384d46e, 0x0246be59, 0x0709a8dc, + 0x06cbc2eb, 0x048d7cb2, 0x054f1685, 0x0e1351b8, 0x0fd13b8f, + 0x0d9785d6, 0x0c55efe1, 0x091af964, 0x08d89353, 0x0a9e2d0a, + 0x0b5c473d, 0x1c26a370, 0x1de4c947, 0x1fa2771e, 0x1e601d29, + 0x1b2f0bac, 0x1aed619b, 0x18abdfc2, 0x1969b5f5, 0x1235f2c8, + 0x13f798ff, 0x11b126a6, 0x10734c91, 0x153c5a14, 0x14fe3023, + 0x16b88e7a, 0x177ae44d, 0x384d46e0, 0x398f2cd7, 0x3bc9928e, + 0x3a0bf8b9, 0x3f44ee3c, 0x3e86840b, 0x3cc03a52, 0x3d025065, + 0x365e1758, 0x379c7d6f, 0x35dac336, 0x3418a901, 0x3157bf84, + 0x3095d5b3, 0x32d36bea, 0x331101dd, 0x246be590, 0x25a98fa7, + 0x27ef31fe, 0x262d5bc9, 0x23624d4c, 0x22a0277b, 0x20e69922, + 0x2124f315, 0x2a78b428, 0x2bbade1f, 0x29fc6046, 0x283e0a71, + 0x2d711cf4, 0x2cb376c3, 0x2ef5c89a, 0x2f37a2ad, 0x709a8dc0, + 0x7158e7f7, 0x731e59ae, 0x72dc3399, 0x7793251c, 0x76514f2b, + 0x7417f172, 0x75d59b45, 0x7e89dc78, 0x7f4bb64f, 0x7d0d0816, + 0x7ccf6221, 0x798074a4, 0x78421e93, 0x7a04a0ca, 0x7bc6cafd, + 0x6cbc2eb0, 0x6d7e4487, 0x6f38fade, 0x6efa90e9, 0x6bb5866c, + 0x6a77ec5b, 0x68315202, 0x69f33835, 0x62af7f08, 0x636d153f, + 0x612bab66, 0x60e9c151, 0x65a6d7d4, 0x6464bde3, 0x662203ba, + 0x67e0698d, 0x48d7cb20, 0x4915a117, 0x4b531f4e, 0x4a917579, + 0x4fde63fc, 0x4e1c09cb, 0x4c5ab792, 0x4d98dda5, 0x46c49a98, + 0x4706f0af, 0x45404ef6, 0x448224c1, 0x41cd3244, 0x400f5873, + 0x4249e62a, 0x438b8c1d, 0x54f16850, 0x55330267, 0x5775bc3e, + 0x56b7d609, 0x53f8c08c, 0x523aaabb, 0x507c14e2, 0x51be7ed5, + 0x5ae239e8, 0x5b2053df, 0x5966ed86, 0x58a487b1, 0x5deb9134, + 0x5c29fb03, 0x5e6f455a, 0x5fad2f6d, 0xe1351b80, 0xe0f771b7, + 0xe2b1cfee, 0xe373a5d9, 0xe63cb35c, 0xe7fed96b, 0xe5b86732, + 0xe47a0d05, 0xef264a38, 0xeee4200f, 0xeca29e56, 0xed60f461, + 0xe82fe2e4, 0xe9ed88d3, 0xebab368a, 0xea695cbd, 0xfd13b8f0, + 0xfcd1d2c7, 0xfe976c9e, 0xff5506a9, 0xfa1a102c, 0xfbd87a1b, + 0xf99ec442, 0xf85cae75, 0xf300e948, 0xf2c2837f, 0xf0843d26, + 0xf1465711, 0xf4094194, 0xf5cb2ba3, 0xf78d95fa, 0xf64fffcd, + 0xd9785d60, 0xd8ba3757, 0xdafc890e, 0xdb3ee339, 0xde71f5bc, + 0xdfb39f8b, 0xddf521d2, 0xdc374be5, 0xd76b0cd8, 0xd6a966ef, + 0xd4efd8b6, 0xd52db281, 0xd062a404, 0xd1a0ce33, 0xd3e6706a, + 0xd2241a5d, 0xc55efe10, 0xc49c9427, 0xc6da2a7e, 0xc7184049, + 0xc25756cc, 0xc3953cfb, 0xc1d382a2, 0xc011e895, 0xcb4dafa8, + 0xca8fc59f, 0xc8c97bc6, 0xc90b11f1, 0xcc440774, 0xcd866d43, + 0xcfc0d31a, 0xce02b92d, 0x91af9640, 0x906dfc77, 0x922b422e, + 0x93e92819, 0x96a63e9c, 0x976454ab, 0x9522eaf2, 0x94e080c5, + 0x9fbcc7f8, 0x9e7eadcf, 0x9c381396, 0x9dfa79a1, 0x98b56f24, + 0x99770513, 0x9b31bb4a, 0x9af3d17d, 0x8d893530, 0x8c4b5f07, + 0x8e0de15e, 0x8fcf8b69, 0x8a809dec, 0x8b42f7db, 0x89044982, + 0x88c623b5, 0x839a6488, 0x82580ebf, 0x801eb0e6, 0x81dcdad1, + 0x8493cc54, 0x8551a663, 0x8717183a, 0x86d5720d, 0xa9e2d0a0, + 0xa820ba97, 0xaa6604ce, 0xaba46ef9, 0xaeeb787c, 0xaf29124b, + 0xad6fac12, 0xacadc625, 0xa7f18118, 0xa633eb2f, 0xa4755576, + 0xa5b73f41, 0xa0f829c4, 0xa13a43f3, 0xa37cfdaa, 0xa2be979d, + 0xb5c473d0, 0xb40619e7, 0xb640a7be, 0xb782cd89, 0xb2cddb0c, + 0xb30fb13b, 0xb1490f62, 0xb08b6555, 0xbbd72268, 0xba15485f, + 0xb853f606, 0xb9919c31, 0xbcde8ab4, 0xbd1ce083, 0xbf5a5eda, + 0xbe9834ed}, + {0x00000000, 0x191b3141, 0x32366282, 0x2b2d53c3, 0x646cc504, + 0x7d77f445, 0x565aa786, 0x4f4196c7, 0xc8d98a08, 0xd1c2bb49, + 0xfaefe88a, 0xe3f4d9cb, 0xacb54f0c, 0xb5ae7e4d, 0x9e832d8e, + 0x87981ccf, 0x4ac21251, 0x53d92310, 0x78f470d3, 0x61ef4192, + 0x2eaed755, 0x37b5e614, 0x1c98b5d7, 0x05838496, 0x821b9859, + 0x9b00a918, 0xb02dfadb, 0xa936cb9a, 0xe6775d5d, 0xff6c6c1c, + 0xd4413fdf, 0xcd5a0e9e, 0x958424a2, 0x8c9f15e3, 0xa7b24620, + 0xbea97761, 0xf1e8e1a6, 0xe8f3d0e7, 0xc3de8324, 0xdac5b265, + 0x5d5daeaa, 0x44469feb, 0x6f6bcc28, 0x7670fd69, 0x39316bae, + 0x202a5aef, 0x0b07092c, 0x121c386d, 0xdf4636f3, 0xc65d07b2, + 0xed705471, 0xf46b6530, 0xbb2af3f7, 0xa231c2b6, 0x891c9175, + 0x9007a034, 0x179fbcfb, 0x0e848dba, 0x25a9de79, 0x3cb2ef38, + 0x73f379ff, 0x6ae848be, 0x41c51b7d, 0x58de2a3c, 0xf0794f05, + 0xe9627e44, 0xc24f2d87, 0xdb541cc6, 0x94158a01, 0x8d0ebb40, + 0xa623e883, 0xbf38d9c2, 0x38a0c50d, 0x21bbf44c, 0x0a96a78f, + 0x138d96ce, 0x5ccc0009, 0x45d73148, 0x6efa628b, 0x77e153ca, + 0xbabb5d54, 0xa3a06c15, 0x888d3fd6, 0x91960e97, 0xded79850, + 0xc7cca911, 0xece1fad2, 0xf5facb93, 0x7262d75c, 0x6b79e61d, + 0x4054b5de, 0x594f849f, 0x160e1258, 0x0f152319, 0x243870da, + 0x3d23419b, 0x65fd6ba7, 0x7ce65ae6, 0x57cb0925, 0x4ed03864, + 0x0191aea3, 0x188a9fe2, 0x33a7cc21, 0x2abcfd60, 0xad24e1af, + 0xb43fd0ee, 0x9f12832d, 0x8609b26c, 0xc94824ab, 0xd05315ea, + 0xfb7e4629, 0xe2657768, 0x2f3f79f6, 0x362448b7, 0x1d091b74, + 0x04122a35, 0x4b53bcf2, 0x52488db3, 0x7965de70, 0x607eef31, + 0xe7e6f3fe, 0xfefdc2bf, 0xd5d0917c, 0xcccba03d, 0x838a36fa, + 0x9a9107bb, 0xb1bc5478, 0xa8a76539, 0x3b83984b, 0x2298a90a, + 0x09b5fac9, 0x10aecb88, 0x5fef5d4f, 0x46f46c0e, 0x6dd93fcd, + 0x74c20e8c, 0xf35a1243, 0xea412302, 0xc16c70c1, 0xd8774180, + 0x9736d747, 0x8e2de606, 0xa500b5c5, 0xbc1b8484, 0x71418a1a, + 0x685abb5b, 0x4377e898, 0x5a6cd9d9, 0x152d4f1e, 0x0c367e5f, + 0x271b2d9c, 0x3e001cdd, 0xb9980012, 0xa0833153, 0x8bae6290, + 0x92b553d1, 0xddf4c516, 0xc4eff457, 0xefc2a794, 0xf6d996d5, + 0xae07bce9, 0xb71c8da8, 0x9c31de6b, 0x852aef2a, 0xca6b79ed, + 0xd37048ac, 0xf85d1b6f, 0xe1462a2e, 0x66de36e1, 0x7fc507a0, + 0x54e85463, 0x4df36522, 0x02b2f3e5, 0x1ba9c2a4, 0x30849167, + 0x299fa026, 0xe4c5aeb8, 0xfdde9ff9, 0xd6f3cc3a, 0xcfe8fd7b, + 0x80a96bbc, 0x99b25afd, 0xb29f093e, 0xab84387f, 0x2c1c24b0, + 0x350715f1, 0x1e2a4632, 0x07317773, 0x4870e1b4, 0x516bd0f5, + 0x7a468336, 0x635db277, 0xcbfad74e, 0xd2e1e60f, 0xf9ccb5cc, + 0xe0d7848d, 0xaf96124a, 0xb68d230b, 0x9da070c8, 0x84bb4189, + 0x03235d46, 0x1a386c07, 0x31153fc4, 0x280e0e85, 0x674f9842, + 0x7e54a903, 0x5579fac0, 0x4c62cb81, 0x8138c51f, 0x9823f45e, + 0xb30ea79d, 0xaa1596dc, 0xe554001b, 0xfc4f315a, 0xd7626299, + 0xce7953d8, 0x49e14f17, 0x50fa7e56, 0x7bd72d95, 0x62cc1cd4, + 0x2d8d8a13, 0x3496bb52, 0x1fbbe891, 0x06a0d9d0, 0x5e7ef3ec, + 0x4765c2ad, 0x6c48916e, 0x7553a02f, 0x3a1236e8, 0x230907a9, + 0x0824546a, 0x113f652b, 0x96a779e4, 0x8fbc48a5, 0xa4911b66, + 0xbd8a2a27, 0xf2cbbce0, 0xebd08da1, 0xc0fdde62, 0xd9e6ef23, + 0x14bce1bd, 0x0da7d0fc, 0x268a833f, 0x3f91b27e, 0x70d024b9, + 0x69cb15f8, 0x42e6463b, 0x5bfd777a, 0xdc656bb5, 0xc57e5af4, + 0xee530937, 0xf7483876, 0xb809aeb1, 0xa1129ff0, 0x8a3fcc33, + 0x9324fd72}, + {0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, + 0x706af48f, 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, + 0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, + 0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, + 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856, + 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9, + 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, + 0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, + 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, + 0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a, + 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599, + 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, + 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, + 0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, + 0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e, + 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01, + 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed, + 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950, + 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, + 0xfbd44c65, 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, + 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, + 0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5, + 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010, + 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, + 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, + 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, + 0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615, + 0x73dc1683, 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8, + 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 0xf00f9344, + 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, + 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, + 0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, + 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, + 0xa6bc5767, 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c, + 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef, + 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, + 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, + 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, + 0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c, + 0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713, + 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b, + 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242, + 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, + 0x18b74777, 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, + 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, 0xa00ae278, + 0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7, + 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66, + 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, + 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, + 0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, + 0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, + 0x2d02ef8d}}; + +local const z_word_t FAR crc_braid_big_table[][256] = { + {0x00000000, 0x96300777, 0x2c610eee, 0xba510999, 0x19c46d07, + 0x8ff46a70, 0x35a563e9, 0xa395649e, 0x3288db0e, 0xa4b8dc79, + 0x1ee9d5e0, 0x88d9d297, 0x2b4cb609, 0xbd7cb17e, 0x072db8e7, + 0x911dbf90, 0x6410b71d, 0xf220b06a, 0x4871b9f3, 0xde41be84, + 0x7dd4da1a, 0xebe4dd6d, 0x51b5d4f4, 0xc785d383, 0x56986c13, + 0xc0a86b64, 0x7af962fd, 0xecc9658a, 0x4f5c0114, 0xd96c0663, + 0x633d0ffa, 0xf50d088d, 0xc8206e3b, 0x5e10694c, 0xe44160d5, + 0x727167a2, 0xd1e4033c, 0x47d4044b, 0xfd850dd2, 0x6bb50aa5, + 0xfaa8b535, 0x6c98b242, 0xd6c9bbdb, 0x40f9bcac, 0xe36cd832, + 0x755cdf45, 0xcf0dd6dc, 0x593dd1ab, 0xac30d926, 0x3a00de51, + 0x8051d7c8, 0x1661d0bf, 0xb5f4b421, 0x23c4b356, 0x9995bacf, + 0x0fa5bdb8, 0x9eb80228, 0x0888055f, 0xb2d90cc6, 0x24e90bb1, + 0x877c6f2f, 0x114c6858, 0xab1d61c1, 0x3d2d66b6, 0x9041dc76, + 0x0671db01, 0xbc20d298, 0x2a10d5ef, 0x8985b171, 0x1fb5b606, + 0xa5e4bf9f, 0x33d4b8e8, 0xa2c90778, 0x34f9000f, 0x8ea80996, + 0x18980ee1, 0xbb0d6a7f, 0x2d3d6d08, 0x976c6491, 0x015c63e6, + 0xf4516b6b, 0x62616c1c, 0xd8306585, 0x4e0062f2, 0xed95066c, + 0x7ba5011b, 0xc1f40882, 0x57c40ff5, 0xc6d9b065, 0x50e9b712, + 0xeab8be8b, 0x7c88b9fc, 0xdf1ddd62, 0x492dda15, 0xf37cd38c, + 0x654cd4fb, 0x5861b24d, 0xce51b53a, 0x7400bca3, 0xe230bbd4, + 0x41a5df4a, 0xd795d83d, 0x6dc4d1a4, 0xfbf4d6d3, 0x6ae96943, + 0xfcd96e34, 0x468867ad, 0xd0b860da, 0x732d0444, 0xe51d0333, + 0x5f4c0aaa, 0xc97c0ddd, 0x3c710550, 0xaa410227, 0x10100bbe, + 0x86200cc9, 0x25b56857, 0xb3856f20, 0x09d466b9, 0x9fe461ce, + 0x0ef9de5e, 0x98c9d929, 0x2298d0b0, 0xb4a8d7c7, 0x173db359, + 0x810db42e, 0x3b5cbdb7, 0xad6cbac0, 0x2083b8ed, 0xb6b3bf9a, + 0x0ce2b603, 0x9ad2b174, 0x3947d5ea, 0xaf77d29d, 0x1526db04, + 0x8316dc73, 0x120b63e3, 0x843b6494, 0x3e6a6d0d, 0xa85a6a7a, + 0x0bcf0ee4, 0x9dff0993, 0x27ae000a, 0xb19e077d, 0x44930ff0, + 0xd2a30887, 0x68f2011e, 0xfec20669, 0x5d5762f7, 0xcb676580, + 0x71366c19, 0xe7066b6e, 0x761bd4fe, 0xe02bd389, 0x5a7ada10, + 0xcc4add67, 0x6fdfb9f9, 0xf9efbe8e, 0x43beb717, 0xd58eb060, + 0xe8a3d6d6, 0x7e93d1a1, 0xc4c2d838, 0x52f2df4f, 0xf167bbd1, + 0x6757bca6, 0xdd06b53f, 0x4b36b248, 0xda2b0dd8, 0x4c1b0aaf, + 0xf64a0336, 0x607a0441, 0xc3ef60df, 0x55df67a8, 0xef8e6e31, + 0x79be6946, 0x8cb361cb, 0x1a8366bc, 0xa0d26f25, 0x36e26852, + 0x95770ccc, 0x03470bbb, 0xb9160222, 0x2f260555, 0xbe3bbac5, + 0x280bbdb2, 0x925ab42b, 0x046ab35c, 0xa7ffd7c2, 0x31cfd0b5, + 0x8b9ed92c, 0x1daede5b, 0xb0c2649b, 0x26f263ec, 0x9ca36a75, + 0x0a936d02, 0xa906099c, 0x3f360eeb, 0x85670772, 0x13570005, + 0x824abf95, 0x147ab8e2, 0xae2bb17b, 0x381bb60c, 0x9b8ed292, + 0x0dbed5e5, 0xb7efdc7c, 0x21dfdb0b, 0xd4d2d386, 0x42e2d4f1, + 0xf8b3dd68, 0x6e83da1f, 0xcd16be81, 0x5b26b9f6, 0xe177b06f, + 0x7747b718, 0xe65a0888, 0x706a0fff, 0xca3b0666, 0x5c0b0111, + 0xff9e658f, 0x69ae62f8, 0xd3ff6b61, 0x45cf6c16, 0x78e20aa0, + 0xeed20dd7, 0x5483044e, 0xc2b30339, 0x612667a7, 0xf71660d0, + 0x4d476949, 0xdb776e3e, 0x4a6ad1ae, 0xdc5ad6d9, 0x660bdf40, + 0xf03bd837, 0x53aebca9, 0xc59ebbde, 0x7fcfb247, 0xe9ffb530, + 0x1cf2bdbd, 0x8ac2baca, 0x3093b353, 0xa6a3b424, 0x0536d0ba, + 0x9306d7cd, 0x2957de54, 0xbf67d923, 0x2e7a66b3, 0xb84a61c4, + 0x021b685d, 0x942b6f2a, 0x37be0bb4, 0xa18e0cc3, 0x1bdf055a, + 0x8def022d}, + {0x00000000, 0x41311b19, 0x82623632, 0xc3532d2b, 0x04c56c64, + 0x45f4777d, 0x86a75a56, 0xc796414f, 0x088ad9c8, 0x49bbc2d1, + 0x8ae8effa, 0xcbd9f4e3, 0x0c4fb5ac, 0x4d7eaeb5, 0x8e2d839e, + 0xcf1c9887, 0x5112c24a, 0x1023d953, 0xd370f478, 0x9241ef61, + 0x55d7ae2e, 0x14e6b537, 0xd7b5981c, 0x96848305, 0x59981b82, + 0x18a9009b, 0xdbfa2db0, 0x9acb36a9, 0x5d5d77e6, 0x1c6c6cff, + 0xdf3f41d4, 0x9e0e5acd, 0xa2248495, 0xe3159f8c, 0x2046b2a7, + 0x6177a9be, 0xa6e1e8f1, 0xe7d0f3e8, 0x2483dec3, 0x65b2c5da, + 0xaaae5d5d, 0xeb9f4644, 0x28cc6b6f, 0x69fd7076, 0xae6b3139, + 0xef5a2a20, 0x2c09070b, 0x6d381c12, 0xf33646df, 0xb2075dc6, + 0x715470ed, 0x30656bf4, 0xf7f32abb, 0xb6c231a2, 0x75911c89, + 0x34a00790, 0xfbbc9f17, 0xba8d840e, 0x79dea925, 0x38efb23c, + 0xff79f373, 0xbe48e86a, 0x7d1bc541, 0x3c2ade58, 0x054f79f0, + 0x447e62e9, 0x872d4fc2, 0xc61c54db, 0x018a1594, 0x40bb0e8d, + 0x83e823a6, 0xc2d938bf, 0x0dc5a038, 0x4cf4bb21, 0x8fa7960a, + 0xce968d13, 0x0900cc5c, 0x4831d745, 0x8b62fa6e, 0xca53e177, + 0x545dbbba, 0x156ca0a3, 0xd63f8d88, 0x970e9691, 0x5098d7de, + 0x11a9ccc7, 0xd2fae1ec, 0x93cbfaf5, 0x5cd76272, 0x1de6796b, + 0xdeb55440, 0x9f844f59, 0x58120e16, 0x1923150f, 0xda703824, + 0x9b41233d, 0xa76bfd65, 0xe65ae67c, 0x2509cb57, 0x6438d04e, + 0xa3ae9101, 0xe29f8a18, 0x21cca733, 0x60fdbc2a, 0xafe124ad, + 0xeed03fb4, 0x2d83129f, 0x6cb20986, 0xab2448c9, 0xea1553d0, + 0x29467efb, 0x687765e2, 0xf6793f2f, 0xb7482436, 0x741b091d, + 0x352a1204, 0xf2bc534b, 0xb38d4852, 0x70de6579, 0x31ef7e60, + 0xfef3e6e7, 0xbfc2fdfe, 0x7c91d0d5, 0x3da0cbcc, 0xfa368a83, + 0xbb07919a, 0x7854bcb1, 0x3965a7a8, 0x4b98833b, 0x0aa99822, + 0xc9fab509, 0x88cbae10, 0x4f5def5f, 0x0e6cf446, 0xcd3fd96d, + 0x8c0ec274, 0x43125af3, 0x022341ea, 0xc1706cc1, 0x804177d8, + 0x47d73697, 0x06e62d8e, 0xc5b500a5, 0x84841bbc, 0x1a8a4171, + 0x5bbb5a68, 0x98e87743, 0xd9d96c5a, 0x1e4f2d15, 0x5f7e360c, + 0x9c2d1b27, 0xdd1c003e, 0x120098b9, 0x533183a0, 0x9062ae8b, + 0xd153b592, 0x16c5f4dd, 0x57f4efc4, 0x94a7c2ef, 0xd596d9f6, + 0xe9bc07ae, 0xa88d1cb7, 0x6bde319c, 0x2aef2a85, 0xed796bca, + 0xac4870d3, 0x6f1b5df8, 0x2e2a46e1, 0xe136de66, 0xa007c57f, + 0x6354e854, 0x2265f34d, 0xe5f3b202, 0xa4c2a91b, 0x67918430, + 0x26a09f29, 0xb8aec5e4, 0xf99fdefd, 0x3accf3d6, 0x7bfde8cf, + 0xbc6ba980, 0xfd5ab299, 0x3e099fb2, 0x7f3884ab, 0xb0241c2c, + 0xf1150735, 0x32462a1e, 0x73773107, 0xb4e17048, 0xf5d06b51, + 0x3683467a, 0x77b25d63, 0x4ed7facb, 0x0fe6e1d2, 0xccb5ccf9, + 0x8d84d7e0, 0x4a1296af, 0x0b238db6, 0xc870a09d, 0x8941bb84, + 0x465d2303, 0x076c381a, 0xc43f1531, 0x850e0e28, 0x42984f67, + 0x03a9547e, 0xc0fa7955, 0x81cb624c, 0x1fc53881, 0x5ef42398, + 0x9da70eb3, 0xdc9615aa, 0x1b0054e5, 0x5a314ffc, 0x996262d7, + 0xd85379ce, 0x174fe149, 0x567efa50, 0x952dd77b, 0xd41ccc62, + 0x138a8d2d, 0x52bb9634, 0x91e8bb1f, 0xd0d9a006, 0xecf37e5e, + 0xadc26547, 0x6e91486c, 0x2fa05375, 0xe836123a, 0xa9070923, + 0x6a542408, 0x2b653f11, 0xe479a796, 0xa548bc8f, 0x661b91a4, + 0x272a8abd, 0xe0bccbf2, 0xa18dd0eb, 0x62defdc0, 0x23efe6d9, + 0xbde1bc14, 0xfcd0a70d, 0x3f838a26, 0x7eb2913f, 0xb924d070, + 0xf815cb69, 0x3b46e642, 0x7a77fd5b, 0xb56b65dc, 0xf45a7ec5, + 0x370953ee, 0x763848f7, 0xb1ae09b8, 0xf09f12a1, 0x33cc3f8a, + 0x72fd2493}, + {0x00000000, 0x376ac201, 0x6ed48403, 0x59be4602, 0xdca80907, + 0xebc2cb06, 0xb27c8d04, 0x85164f05, 0xb851130e, 0x8f3bd10f, + 0xd685970d, 0xe1ef550c, 0x64f91a09, 0x5393d808, 0x0a2d9e0a, + 0x3d475c0b, 0x70a3261c, 0x47c9e41d, 0x1e77a21f, 0x291d601e, + 0xac0b2f1b, 0x9b61ed1a, 0xc2dfab18, 0xf5b56919, 0xc8f23512, + 0xff98f713, 0xa626b111, 0x914c7310, 0x145a3c15, 0x2330fe14, + 0x7a8eb816, 0x4de47a17, 0xe0464d38, 0xd72c8f39, 0x8e92c93b, + 0xb9f80b3a, 0x3cee443f, 0x0b84863e, 0x523ac03c, 0x6550023d, + 0x58175e36, 0x6f7d9c37, 0x36c3da35, 0x01a91834, 0x84bf5731, + 0xb3d59530, 0xea6bd332, 0xdd011133, 0x90e56b24, 0xa78fa925, + 0xfe31ef27, 0xc95b2d26, 0x4c4d6223, 0x7b27a022, 0x2299e620, + 0x15f32421, 0x28b4782a, 0x1fdeba2b, 0x4660fc29, 0x710a3e28, + 0xf41c712d, 0xc376b32c, 0x9ac8f52e, 0xada2372f, 0xc08d9a70, + 0xf7e75871, 0xae591e73, 0x9933dc72, 0x1c259377, 0x2b4f5176, + 0x72f11774, 0x459bd575, 0x78dc897e, 0x4fb64b7f, 0x16080d7d, + 0x2162cf7c, 0xa4748079, 0x931e4278, 0xcaa0047a, 0xfdcac67b, + 0xb02ebc6c, 0x87447e6d, 0xdefa386f, 0xe990fa6e, 0x6c86b56b, + 0x5bec776a, 0x02523168, 0x3538f369, 0x087faf62, 0x3f156d63, + 0x66ab2b61, 0x51c1e960, 0xd4d7a665, 0xe3bd6464, 0xba032266, + 0x8d69e067, 0x20cbd748, 0x17a11549, 0x4e1f534b, 0x7975914a, + 0xfc63de4f, 0xcb091c4e, 0x92b75a4c, 0xa5dd984d, 0x989ac446, + 0xaff00647, 0xf64e4045, 0xc1248244, 0x4432cd41, 0x73580f40, + 0x2ae64942, 0x1d8c8b43, 0x5068f154, 0x67023355, 0x3ebc7557, + 0x09d6b756, 0x8cc0f853, 0xbbaa3a52, 0xe2147c50, 0xd57ebe51, + 0xe839e25a, 0xdf53205b, 0x86ed6659, 0xb187a458, 0x3491eb5d, + 0x03fb295c, 0x5a456f5e, 0x6d2fad5f, 0x801b35e1, 0xb771f7e0, + 0xeecfb1e2, 0xd9a573e3, 0x5cb33ce6, 0x6bd9fee7, 0x3267b8e5, + 0x050d7ae4, 0x384a26ef, 0x0f20e4ee, 0x569ea2ec, 0x61f460ed, + 0xe4e22fe8, 0xd388ede9, 0x8a36abeb, 0xbd5c69ea, 0xf0b813fd, + 0xc7d2d1fc, 0x9e6c97fe, 0xa90655ff, 0x2c101afa, 0x1b7ad8fb, + 0x42c49ef9, 0x75ae5cf8, 0x48e900f3, 0x7f83c2f2, 0x263d84f0, + 0x115746f1, 0x944109f4, 0xa32bcbf5, 0xfa958df7, 0xcdff4ff6, + 0x605d78d9, 0x5737bad8, 0x0e89fcda, 0x39e33edb, 0xbcf571de, + 0x8b9fb3df, 0xd221f5dd, 0xe54b37dc, 0xd80c6bd7, 0xef66a9d6, + 0xb6d8efd4, 0x81b22dd5, 0x04a462d0, 0x33cea0d1, 0x6a70e6d3, + 0x5d1a24d2, 0x10fe5ec5, 0x27949cc4, 0x7e2adac6, 0x494018c7, + 0xcc5657c2, 0xfb3c95c3, 0xa282d3c1, 0x95e811c0, 0xa8af4dcb, + 0x9fc58fca, 0xc67bc9c8, 0xf1110bc9, 0x740744cc, 0x436d86cd, + 0x1ad3c0cf, 0x2db902ce, 0x4096af91, 0x77fc6d90, 0x2e422b92, + 0x1928e993, 0x9c3ea696, 0xab546497, 0xf2ea2295, 0xc580e094, + 0xf8c7bc9f, 0xcfad7e9e, 0x9613389c, 0xa179fa9d, 0x246fb598, + 0x13057799, 0x4abb319b, 0x7dd1f39a, 0x3035898d, 0x075f4b8c, + 0x5ee10d8e, 0x698bcf8f, 0xec9d808a, 0xdbf7428b, 0x82490489, + 0xb523c688, 0x88649a83, 0xbf0e5882, 0xe6b01e80, 0xd1dadc81, + 0x54cc9384, 0x63a65185, 0x3a181787, 0x0d72d586, 0xa0d0e2a9, + 0x97ba20a8, 0xce0466aa, 0xf96ea4ab, 0x7c78ebae, 0x4b1229af, + 0x12ac6fad, 0x25c6adac, 0x1881f1a7, 0x2feb33a6, 0x765575a4, + 0x413fb7a5, 0xc429f8a0, 0xf3433aa1, 0xaafd7ca3, 0x9d97bea2, + 0xd073c4b5, 0xe71906b4, 0xbea740b6, 0x89cd82b7, 0x0cdbcdb2, + 0x3bb10fb3, 0x620f49b1, 0x55658bb0, 0x6822d7bb, 0x5f4815ba, + 0x06f653b8, 0x319c91b9, 0xb48adebc, 0x83e01cbd, 0xda5e5abf, + 0xed3498be}, + {0x00000000, 0x6567bcb8, 0x8bc809aa, 0xeeafb512, 0x5797628f, + 0x32f0de37, 0xdc5f6b25, 0xb938d79d, 0xef28b4c5, 0x8a4f087d, + 0x64e0bd6f, 0x018701d7, 0xb8bfd64a, 0xddd86af2, 0x3377dfe0, + 0x56106358, 0x9f571950, 0xfa30a5e8, 0x149f10fa, 0x71f8ac42, + 0xc8c07bdf, 0xada7c767, 0x43087275, 0x266fcecd, 0x707fad95, + 0x1518112d, 0xfbb7a43f, 0x9ed01887, 0x27e8cf1a, 0x428f73a2, + 0xac20c6b0, 0xc9477a08, 0x3eaf32a0, 0x5bc88e18, 0xb5673b0a, + 0xd00087b2, 0x6938502f, 0x0c5fec97, 0xe2f05985, 0x8797e53d, + 0xd1878665, 0xb4e03add, 0x5a4f8fcf, 0x3f283377, 0x8610e4ea, + 0xe3775852, 0x0dd8ed40, 0x68bf51f8, 0xa1f82bf0, 0xc49f9748, + 0x2a30225a, 0x4f579ee2, 0xf66f497f, 0x9308f5c7, 0x7da740d5, + 0x18c0fc6d, 0x4ed09f35, 0x2bb7238d, 0xc518969f, 0xa07f2a27, + 0x1947fdba, 0x7c204102, 0x928ff410, 0xf7e848a8, 0x3d58149b, + 0x583fa823, 0xb6901d31, 0xd3f7a189, 0x6acf7614, 0x0fa8caac, + 0xe1077fbe, 0x8460c306, 0xd270a05e, 0xb7171ce6, 0x59b8a9f4, + 0x3cdf154c, 0x85e7c2d1, 0xe0807e69, 0x0e2fcb7b, 0x6b4877c3, + 0xa20f0dcb, 0xc768b173, 0x29c70461, 0x4ca0b8d9, 0xf5986f44, + 0x90ffd3fc, 0x7e5066ee, 0x1b37da56, 0x4d27b90e, 0x284005b6, + 0xc6efb0a4, 0xa3880c1c, 0x1ab0db81, 0x7fd76739, 0x9178d22b, + 0xf41f6e93, 0x03f7263b, 0x66909a83, 0x883f2f91, 0xed589329, + 0x546044b4, 0x3107f80c, 0xdfa84d1e, 0xbacff1a6, 0xecdf92fe, + 0x89b82e46, 0x67179b54, 0x027027ec, 0xbb48f071, 0xde2f4cc9, + 0x3080f9db, 0x55e74563, 0x9ca03f6b, 0xf9c783d3, 0x176836c1, + 0x720f8a79, 0xcb375de4, 0xae50e15c, 0x40ff544e, 0x2598e8f6, + 0x73888bae, 0x16ef3716, 0xf8408204, 0x9d273ebc, 0x241fe921, + 0x41785599, 0xafd7e08b, 0xcab05c33, 0x3bb659ed, 0x5ed1e555, + 0xb07e5047, 0xd519ecff, 0x6c213b62, 0x094687da, 0xe7e932c8, + 0x828e8e70, 0xd49eed28, 0xb1f95190, 0x5f56e482, 0x3a31583a, + 0x83098fa7, 0xe66e331f, 0x08c1860d, 0x6da63ab5, 0xa4e140bd, + 0xc186fc05, 0x2f294917, 0x4a4ef5af, 0xf3762232, 0x96119e8a, + 0x78be2b98, 0x1dd99720, 0x4bc9f478, 0x2eae48c0, 0xc001fdd2, + 0xa566416a, 0x1c5e96f7, 0x79392a4f, 0x97969f5d, 0xf2f123e5, + 0x05196b4d, 0x607ed7f5, 0x8ed162e7, 0xebb6de5f, 0x528e09c2, + 0x37e9b57a, 0xd9460068, 0xbc21bcd0, 0xea31df88, 0x8f566330, + 0x61f9d622, 0x049e6a9a, 0xbda6bd07, 0xd8c101bf, 0x366eb4ad, + 0x53090815, 0x9a4e721d, 0xff29cea5, 0x11867bb7, 0x74e1c70f, + 0xcdd91092, 0xa8beac2a, 0x46111938, 0x2376a580, 0x7566c6d8, + 0x10017a60, 0xfeaecf72, 0x9bc973ca, 0x22f1a457, 0x479618ef, + 0xa939adfd, 0xcc5e1145, 0x06ee4d76, 0x6389f1ce, 0x8d2644dc, + 0xe841f864, 0x51792ff9, 0x341e9341, 0xdab12653, 0xbfd69aeb, + 0xe9c6f9b3, 0x8ca1450b, 0x620ef019, 0x07694ca1, 0xbe519b3c, + 0xdb362784, 0x35999296, 0x50fe2e2e, 0x99b95426, 0xfcdee89e, + 0x12715d8c, 0x7716e134, 0xce2e36a9, 0xab498a11, 0x45e63f03, + 0x208183bb, 0x7691e0e3, 0x13f65c5b, 0xfd59e949, 0x983e55f1, + 0x2106826c, 0x44613ed4, 0xaace8bc6, 0xcfa9377e, 0x38417fd6, + 0x5d26c36e, 0xb389767c, 0xd6eecac4, 0x6fd61d59, 0x0ab1a1e1, + 0xe41e14f3, 0x8179a84b, 0xd769cb13, 0xb20e77ab, 0x5ca1c2b9, + 0x39c67e01, 0x80fea99c, 0xe5991524, 0x0b36a036, 0x6e511c8e, + 0xa7166686, 0xc271da3e, 0x2cde6f2c, 0x49b9d394, 0xf0810409, + 0x95e6b8b1, 0x7b490da3, 0x1e2eb11b, 0x483ed243, 0x2d596efb, + 0xc3f6dbe9, 0xa6916751, 0x1fa9b0cc, 0x7ace0c74, 0x9461b966, + 0xf10605de}}; + +#endif + +#endif + +#if N == 2 + +#if W == 8 + +local const z_crc_t FAR crc_braid_table[][256] = { + {0x00000000, 0xae689191, 0x87a02563, 0x29c8b4f2, 0xd4314c87, + 0x7a59dd16, 0x539169e4, 0xfdf9f875, 0x73139f4f, 0xdd7b0ede, + 0xf4b3ba2c, 0x5adb2bbd, 0xa722d3c8, 0x094a4259, 0x2082f6ab, + 0x8eea673a, 0xe6273e9e, 0x484faf0f, 0x61871bfd, 0xcfef8a6c, + 0x32167219, 0x9c7ee388, 0xb5b6577a, 0x1bdec6eb, 0x9534a1d1, + 0x3b5c3040, 0x129484b2, 0xbcfc1523, 0x4105ed56, 0xef6d7cc7, + 0xc6a5c835, 0x68cd59a4, 0x173f7b7d, 0xb957eaec, 0x909f5e1e, + 0x3ef7cf8f, 0xc30e37fa, 0x6d66a66b, 0x44ae1299, 0xeac68308, + 0x642ce432, 0xca4475a3, 0xe38cc151, 0x4de450c0, 0xb01da8b5, + 0x1e753924, 0x37bd8dd6, 0x99d51c47, 0xf11845e3, 0x5f70d472, + 0x76b86080, 0xd8d0f111, 0x25290964, 0x8b4198f5, 0xa2892c07, + 0x0ce1bd96, 0x820bdaac, 0x2c634b3d, 0x05abffcf, 0xabc36e5e, + 0x563a962b, 0xf85207ba, 0xd19ab348, 0x7ff222d9, 0x2e7ef6fa, + 0x8016676b, 0xa9ded399, 0x07b64208, 0xfa4fba7d, 0x54272bec, + 0x7def9f1e, 0xd3870e8f, 0x5d6d69b5, 0xf305f824, 0xdacd4cd6, + 0x74a5dd47, 0x895c2532, 0x2734b4a3, 0x0efc0051, 0xa09491c0, + 0xc859c864, 0x663159f5, 0x4ff9ed07, 0xe1917c96, 0x1c6884e3, + 0xb2001572, 0x9bc8a180, 0x35a03011, 0xbb4a572b, 0x1522c6ba, + 0x3cea7248, 0x9282e3d9, 0x6f7b1bac, 0xc1138a3d, 0xe8db3ecf, + 0x46b3af5e, 0x39418d87, 0x97291c16, 0xbee1a8e4, 0x10893975, + 0xed70c100, 0x43185091, 0x6ad0e463, 0xc4b875f2, 0x4a5212c8, + 0xe43a8359, 0xcdf237ab, 0x639aa63a, 0x9e635e4f, 0x300bcfde, + 0x19c37b2c, 0xb7abeabd, 0xdf66b319, 0x710e2288, 0x58c6967a, + 0xf6ae07eb, 0x0b57ff9e, 0xa53f6e0f, 0x8cf7dafd, 0x229f4b6c, + 0xac752c56, 0x021dbdc7, 0x2bd50935, 0x85bd98a4, 0x784460d1, + 0xd62cf140, 0xffe445b2, 0x518cd423, 0x5cfdedf4, 0xf2957c65, + 0xdb5dc897, 0x75355906, 0x88cca173, 0x26a430e2, 0x0f6c8410, + 0xa1041581, 0x2fee72bb, 0x8186e32a, 0xa84e57d8, 0x0626c649, + 0xfbdf3e3c, 0x55b7afad, 0x7c7f1b5f, 0xd2178ace, 0xbadad36a, + 0x14b242fb, 0x3d7af609, 0x93126798, 0x6eeb9fed, 0xc0830e7c, + 0xe94bba8e, 0x47232b1f, 0xc9c94c25, 0x67a1ddb4, 0x4e696946, + 0xe001f8d7, 0x1df800a2, 0xb3909133, 0x9a5825c1, 0x3430b450, + 0x4bc29689, 0xe5aa0718, 0xcc62b3ea, 0x620a227b, 0x9ff3da0e, + 0x319b4b9f, 0x1853ff6d, 0xb63b6efc, 0x38d109c6, 0x96b99857, + 0xbf712ca5, 0x1119bd34, 0xece04541, 0x4288d4d0, 0x6b406022, + 0xc528f1b3, 0xade5a817, 0x038d3986, 0x2a458d74, 0x842d1ce5, + 0x79d4e490, 0xd7bc7501, 0xfe74c1f3, 0x501c5062, 0xdef63758, + 0x709ea6c9, 0x5956123b, 0xf73e83aa, 0x0ac77bdf, 0xa4afea4e, + 0x8d675ebc, 0x230fcf2d, 0x72831b0e, 0xdceb8a9f, 0xf5233e6d, + 0x5b4baffc, 0xa6b25789, 0x08dac618, 0x211272ea, 0x8f7ae37b, + 0x01908441, 0xaff815d0, 0x8630a122, 0x285830b3, 0xd5a1c8c6, + 0x7bc95957, 0x5201eda5, 0xfc697c34, 0x94a42590, 0x3accb401, + 0x130400f3, 0xbd6c9162, 0x40956917, 0xeefdf886, 0xc7354c74, + 0x695ddde5, 0xe7b7badf, 0x49df2b4e, 0x60179fbc, 0xce7f0e2d, + 0x3386f658, 0x9dee67c9, 0xb426d33b, 0x1a4e42aa, 0x65bc6073, + 0xcbd4f1e2, 0xe21c4510, 0x4c74d481, 0xb18d2cf4, 0x1fe5bd65, + 0x362d0997, 0x98459806, 0x16afff3c, 0xb8c76ead, 0x910fda5f, + 0x3f674bce, 0xc29eb3bb, 0x6cf6222a, 0x453e96d8, 0xeb560749, + 0x839b5eed, 0x2df3cf7c, 0x043b7b8e, 0xaa53ea1f, 0x57aa126a, + 0xf9c283fb, 0xd00a3709, 0x7e62a698, 0xf088c1a2, 0x5ee05033, + 0x7728e4c1, 0xd9407550, 0x24b98d25, 0x8ad11cb4, 0xa319a846, + 0x0d7139d7}, + {0x00000000, 0xb9fbdbe8, 0xa886b191, 0x117d6a79, 0x8a7c6563, + 0x3387be8b, 0x22fad4f2, 0x9b010f1a, 0xcf89cc87, 0x7672176f, + 0x670f7d16, 0xdef4a6fe, 0x45f5a9e4, 0xfc0e720c, 0xed731875, + 0x5488c39d, 0x44629f4f, 0xfd9944a7, 0xece42ede, 0x551ff536, + 0xce1efa2c, 0x77e521c4, 0x66984bbd, 0xdf639055, 0x8beb53c8, + 0x32108820, 0x236de259, 0x9a9639b1, 0x019736ab, 0xb86ced43, + 0xa911873a, 0x10ea5cd2, 0x88c53e9e, 0x313ee576, 0x20438f0f, + 0x99b854e7, 0x02b95bfd, 0xbb428015, 0xaa3fea6c, 0x13c43184, + 0x474cf219, 0xfeb729f1, 0xefca4388, 0x56319860, 0xcd30977a, + 0x74cb4c92, 0x65b626eb, 0xdc4dfd03, 0xcca7a1d1, 0x755c7a39, + 0x64211040, 0xdddacba8, 0x46dbc4b2, 0xff201f5a, 0xee5d7523, + 0x57a6aecb, 0x032e6d56, 0xbad5b6be, 0xaba8dcc7, 0x1253072f, + 0x89520835, 0x30a9d3dd, 0x21d4b9a4, 0x982f624c, 0xcafb7b7d, + 0x7300a095, 0x627dcaec, 0xdb861104, 0x40871e1e, 0xf97cc5f6, + 0xe801af8f, 0x51fa7467, 0x0572b7fa, 0xbc896c12, 0xadf4066b, + 0x140fdd83, 0x8f0ed299, 0x36f50971, 0x27886308, 0x9e73b8e0, + 0x8e99e432, 0x37623fda, 0x261f55a3, 0x9fe48e4b, 0x04e58151, + 0xbd1e5ab9, 0xac6330c0, 0x1598eb28, 0x411028b5, 0xf8ebf35d, + 0xe9969924, 0x506d42cc, 0xcb6c4dd6, 0x7297963e, 0x63eafc47, + 0xda1127af, 0x423e45e3, 0xfbc59e0b, 0xeab8f472, 0x53432f9a, + 0xc8422080, 0x71b9fb68, 0x60c49111, 0xd93f4af9, 0x8db78964, + 0x344c528c, 0x253138f5, 0x9ccae31d, 0x07cbec07, 0xbe3037ef, + 0xaf4d5d96, 0x16b6867e, 0x065cdaac, 0xbfa70144, 0xaeda6b3d, + 0x1721b0d5, 0x8c20bfcf, 0x35db6427, 0x24a60e5e, 0x9d5dd5b6, + 0xc9d5162b, 0x702ecdc3, 0x6153a7ba, 0xd8a87c52, 0x43a97348, + 0xfa52a8a0, 0xeb2fc2d9, 0x52d41931, 0x4e87f0bb, 0xf77c2b53, + 0xe601412a, 0x5ffa9ac2, 0xc4fb95d8, 0x7d004e30, 0x6c7d2449, + 0xd586ffa1, 0x810e3c3c, 0x38f5e7d4, 0x29888dad, 0x90735645, + 0x0b72595f, 0xb28982b7, 0xa3f4e8ce, 0x1a0f3326, 0x0ae56ff4, + 0xb31eb41c, 0xa263de65, 0x1b98058d, 0x80990a97, 0x3962d17f, + 0x281fbb06, 0x91e460ee, 0xc56ca373, 0x7c97789b, 0x6dea12e2, + 0xd411c90a, 0x4f10c610, 0xf6eb1df8, 0xe7967781, 0x5e6dac69, + 0xc642ce25, 0x7fb915cd, 0x6ec47fb4, 0xd73fa45c, 0x4c3eab46, + 0xf5c570ae, 0xe4b81ad7, 0x5d43c13f, 0x09cb02a2, 0xb030d94a, + 0xa14db333, 0x18b668db, 0x83b767c1, 0x3a4cbc29, 0x2b31d650, + 0x92ca0db8, 0x8220516a, 0x3bdb8a82, 0x2aa6e0fb, 0x935d3b13, + 0x085c3409, 0xb1a7efe1, 0xa0da8598, 0x19215e70, 0x4da99ded, + 0xf4524605, 0xe52f2c7c, 0x5cd4f794, 0xc7d5f88e, 0x7e2e2366, + 0x6f53491f, 0xd6a892f7, 0x847c8bc6, 0x3d87502e, 0x2cfa3a57, + 0x9501e1bf, 0x0e00eea5, 0xb7fb354d, 0xa6865f34, 0x1f7d84dc, + 0x4bf54741, 0xf20e9ca9, 0xe373f6d0, 0x5a882d38, 0xc1892222, + 0x7872f9ca, 0x690f93b3, 0xd0f4485b, 0xc01e1489, 0x79e5cf61, + 0x6898a518, 0xd1637ef0, 0x4a6271ea, 0xf399aa02, 0xe2e4c07b, + 0x5b1f1b93, 0x0f97d80e, 0xb66c03e6, 0xa711699f, 0x1eeab277, + 0x85ebbd6d, 0x3c106685, 0x2d6d0cfc, 0x9496d714, 0x0cb9b558, + 0xb5426eb0, 0xa43f04c9, 0x1dc4df21, 0x86c5d03b, 0x3f3e0bd3, + 0x2e4361aa, 0x97b8ba42, 0xc33079df, 0x7acba237, 0x6bb6c84e, + 0xd24d13a6, 0x494c1cbc, 0xf0b7c754, 0xe1caad2d, 0x583176c5, + 0x48db2a17, 0xf120f1ff, 0xe05d9b86, 0x59a6406e, 0xc2a74f74, + 0x7b5c949c, 0x6a21fee5, 0xd3da250d, 0x8752e690, 0x3ea93d78, + 0x2fd45701, 0x962f8ce9, 0x0d2e83f3, 0xb4d5581b, 0xa5a83262, + 0x1c53e98a}, + {0x00000000, 0x9d0fe176, 0xe16ec4ad, 0x7c6125db, 0x19ac8f1b, + 0x84a36e6d, 0xf8c24bb6, 0x65cdaac0, 0x33591e36, 0xae56ff40, + 0xd237da9b, 0x4f383bed, 0x2af5912d, 0xb7fa705b, 0xcb9b5580, + 0x5694b4f6, 0x66b23c6c, 0xfbbddd1a, 0x87dcf8c1, 0x1ad319b7, + 0x7f1eb377, 0xe2115201, 0x9e7077da, 0x037f96ac, 0x55eb225a, + 0xc8e4c32c, 0xb485e6f7, 0x298a0781, 0x4c47ad41, 0xd1484c37, + 0xad2969ec, 0x3026889a, 0xcd6478d8, 0x506b99ae, 0x2c0abc75, + 0xb1055d03, 0xd4c8f7c3, 0x49c716b5, 0x35a6336e, 0xa8a9d218, + 0xfe3d66ee, 0x63328798, 0x1f53a243, 0x825c4335, 0xe791e9f5, + 0x7a9e0883, 0x06ff2d58, 0x9bf0cc2e, 0xabd644b4, 0x36d9a5c2, + 0x4ab88019, 0xd7b7616f, 0xb27acbaf, 0x2f752ad9, 0x53140f02, + 0xce1bee74, 0x988f5a82, 0x0580bbf4, 0x79e19e2f, 0xe4ee7f59, + 0x8123d599, 0x1c2c34ef, 0x604d1134, 0xfd42f042, 0x41b9f7f1, + 0xdcb61687, 0xa0d7335c, 0x3dd8d22a, 0x581578ea, 0xc51a999c, + 0xb97bbc47, 0x24745d31, 0x72e0e9c7, 0xefef08b1, 0x938e2d6a, + 0x0e81cc1c, 0x6b4c66dc, 0xf64387aa, 0x8a22a271, 0x172d4307, + 0x270bcb9d, 0xba042aeb, 0xc6650f30, 0x5b6aee46, 0x3ea74486, + 0xa3a8a5f0, 0xdfc9802b, 0x42c6615d, 0x1452d5ab, 0x895d34dd, + 0xf53c1106, 0x6833f070, 0x0dfe5ab0, 0x90f1bbc6, 0xec909e1d, + 0x719f7f6b, 0x8cdd8f29, 0x11d26e5f, 0x6db34b84, 0xf0bcaaf2, + 0x95710032, 0x087ee144, 0x741fc49f, 0xe91025e9, 0xbf84911f, + 0x228b7069, 0x5eea55b2, 0xc3e5b4c4, 0xa6281e04, 0x3b27ff72, + 0x4746daa9, 0xda493bdf, 0xea6fb345, 0x77605233, 0x0b0177e8, + 0x960e969e, 0xf3c33c5e, 0x6eccdd28, 0x12adf8f3, 0x8fa21985, + 0xd936ad73, 0x44394c05, 0x385869de, 0xa55788a8, 0xc09a2268, + 0x5d95c31e, 0x21f4e6c5, 0xbcfb07b3, 0x8373efe2, 0x1e7c0e94, + 0x621d2b4f, 0xff12ca39, 0x9adf60f9, 0x07d0818f, 0x7bb1a454, + 0xe6be4522, 0xb02af1d4, 0x2d2510a2, 0x51443579, 0xcc4bd40f, + 0xa9867ecf, 0x34899fb9, 0x48e8ba62, 0xd5e75b14, 0xe5c1d38e, + 0x78ce32f8, 0x04af1723, 0x99a0f655, 0xfc6d5c95, 0x6162bde3, + 0x1d039838, 0x800c794e, 0xd698cdb8, 0x4b972cce, 0x37f60915, + 0xaaf9e863, 0xcf3442a3, 0x523ba3d5, 0x2e5a860e, 0xb3556778, + 0x4e17973a, 0xd318764c, 0xaf795397, 0x3276b2e1, 0x57bb1821, + 0xcab4f957, 0xb6d5dc8c, 0x2bda3dfa, 0x7d4e890c, 0xe041687a, + 0x9c204da1, 0x012facd7, 0x64e20617, 0xf9ede761, 0x858cc2ba, + 0x188323cc, 0x28a5ab56, 0xb5aa4a20, 0xc9cb6ffb, 0x54c48e8d, + 0x3109244d, 0xac06c53b, 0xd067e0e0, 0x4d680196, 0x1bfcb560, + 0x86f35416, 0xfa9271cd, 0x679d90bb, 0x02503a7b, 0x9f5fdb0d, + 0xe33efed6, 0x7e311fa0, 0xc2ca1813, 0x5fc5f965, 0x23a4dcbe, + 0xbeab3dc8, 0xdb669708, 0x4669767e, 0x3a0853a5, 0xa707b2d3, + 0xf1930625, 0x6c9ce753, 0x10fdc288, 0x8df223fe, 0xe83f893e, + 0x75306848, 0x09514d93, 0x945eace5, 0xa478247f, 0x3977c509, + 0x4516e0d2, 0xd81901a4, 0xbdd4ab64, 0x20db4a12, 0x5cba6fc9, + 0xc1b58ebf, 0x97213a49, 0x0a2edb3f, 0x764ffee4, 0xeb401f92, + 0x8e8db552, 0x13825424, 0x6fe371ff, 0xf2ec9089, 0x0fae60cb, + 0x92a181bd, 0xeec0a466, 0x73cf4510, 0x1602efd0, 0x8b0d0ea6, + 0xf76c2b7d, 0x6a63ca0b, 0x3cf77efd, 0xa1f89f8b, 0xdd99ba50, + 0x40965b26, 0x255bf1e6, 0xb8541090, 0xc435354b, 0x593ad43d, + 0x691c5ca7, 0xf413bdd1, 0x8872980a, 0x157d797c, 0x70b0d3bc, + 0xedbf32ca, 0x91de1711, 0x0cd1f667, 0x5a454291, 0xc74aa3e7, + 0xbb2b863c, 0x2624674a, 0x43e9cd8a, 0xdee62cfc, 0xa2870927, + 0x3f88e851}, + {0x00000000, 0xdd96d985, 0x605cb54b, 0xbdca6cce, 0xc0b96a96, + 0x1d2fb313, 0xa0e5dfdd, 0x7d730658, 0x5a03d36d, 0x87950ae8, + 0x3a5f6626, 0xe7c9bfa3, 0x9abab9fb, 0x472c607e, 0xfae60cb0, + 0x2770d535, 0xb407a6da, 0x69917f5f, 0xd45b1391, 0x09cdca14, + 0x74becc4c, 0xa92815c9, 0x14e27907, 0xc974a082, 0xee0475b7, + 0x3392ac32, 0x8e58c0fc, 0x53ce1979, 0x2ebd1f21, 0xf32bc6a4, + 0x4ee1aa6a, 0x937773ef, 0xb37e4bf5, 0x6ee89270, 0xd322febe, + 0x0eb4273b, 0x73c72163, 0xae51f8e6, 0x139b9428, 0xce0d4dad, + 0xe97d9898, 0x34eb411d, 0x89212dd3, 0x54b7f456, 0x29c4f20e, + 0xf4522b8b, 0x49984745, 0x940e9ec0, 0x0779ed2f, 0xdaef34aa, + 0x67255864, 0xbab381e1, 0xc7c087b9, 0x1a565e3c, 0xa79c32f2, + 0x7a0aeb77, 0x5d7a3e42, 0x80ece7c7, 0x3d268b09, 0xe0b0528c, + 0x9dc354d4, 0x40558d51, 0xfd9fe19f, 0x2009381a, 0xbd8d91ab, + 0x601b482e, 0xddd124e0, 0x0047fd65, 0x7d34fb3d, 0xa0a222b8, + 0x1d684e76, 0xc0fe97f3, 0xe78e42c6, 0x3a189b43, 0x87d2f78d, + 0x5a442e08, 0x27372850, 0xfaa1f1d5, 0x476b9d1b, 0x9afd449e, + 0x098a3771, 0xd41ceef4, 0x69d6823a, 0xb4405bbf, 0xc9335de7, + 0x14a58462, 0xa96fe8ac, 0x74f93129, 0x5389e41c, 0x8e1f3d99, + 0x33d55157, 0xee4388d2, 0x93308e8a, 0x4ea6570f, 0xf36c3bc1, + 0x2efae244, 0x0ef3da5e, 0xd36503db, 0x6eaf6f15, 0xb339b690, + 0xce4ab0c8, 0x13dc694d, 0xae160583, 0x7380dc06, 0x54f00933, + 0x8966d0b6, 0x34acbc78, 0xe93a65fd, 0x944963a5, 0x49dfba20, + 0xf415d6ee, 0x29830f6b, 0xbaf47c84, 0x6762a501, 0xdaa8c9cf, + 0x073e104a, 0x7a4d1612, 0xa7dbcf97, 0x1a11a359, 0xc7877adc, + 0xe0f7afe9, 0x3d61766c, 0x80ab1aa2, 0x5d3dc327, 0x204ec57f, + 0xfdd81cfa, 0x40127034, 0x9d84a9b1, 0xa06a2517, 0x7dfcfc92, + 0xc036905c, 0x1da049d9, 0x60d34f81, 0xbd459604, 0x008ffaca, + 0xdd19234f, 0xfa69f67a, 0x27ff2fff, 0x9a354331, 0x47a39ab4, + 0x3ad09cec, 0xe7464569, 0x5a8c29a7, 0x871af022, 0x146d83cd, + 0xc9fb5a48, 0x74313686, 0xa9a7ef03, 0xd4d4e95b, 0x094230de, + 0xb4885c10, 0x691e8595, 0x4e6e50a0, 0x93f88925, 0x2e32e5eb, + 0xf3a43c6e, 0x8ed73a36, 0x5341e3b3, 0xee8b8f7d, 0x331d56f8, + 0x13146ee2, 0xce82b767, 0x7348dba9, 0xaede022c, 0xd3ad0474, + 0x0e3bddf1, 0xb3f1b13f, 0x6e6768ba, 0x4917bd8f, 0x9481640a, + 0x294b08c4, 0xf4ddd141, 0x89aed719, 0x54380e9c, 0xe9f26252, + 0x3464bbd7, 0xa713c838, 0x7a8511bd, 0xc74f7d73, 0x1ad9a4f6, + 0x67aaa2ae, 0xba3c7b2b, 0x07f617e5, 0xda60ce60, 0xfd101b55, + 0x2086c2d0, 0x9d4cae1e, 0x40da779b, 0x3da971c3, 0xe03fa846, + 0x5df5c488, 0x80631d0d, 0x1de7b4bc, 0xc0716d39, 0x7dbb01f7, + 0xa02dd872, 0xdd5ede2a, 0x00c807af, 0xbd026b61, 0x6094b2e4, + 0x47e467d1, 0x9a72be54, 0x27b8d29a, 0xfa2e0b1f, 0x875d0d47, + 0x5acbd4c2, 0xe701b80c, 0x3a976189, 0xa9e01266, 0x7476cbe3, + 0xc9bca72d, 0x142a7ea8, 0x695978f0, 0xb4cfa175, 0x0905cdbb, + 0xd493143e, 0xf3e3c10b, 0x2e75188e, 0x93bf7440, 0x4e29adc5, + 0x335aab9d, 0xeecc7218, 0x53061ed6, 0x8e90c753, 0xae99ff49, + 0x730f26cc, 0xcec54a02, 0x13539387, 0x6e2095df, 0xb3b64c5a, + 0x0e7c2094, 0xd3eaf911, 0xf49a2c24, 0x290cf5a1, 0x94c6996f, + 0x495040ea, 0x342346b2, 0xe9b59f37, 0x547ff3f9, 0x89e92a7c, + 0x1a9e5993, 0xc7088016, 0x7ac2ecd8, 0xa754355d, 0xda273305, + 0x07b1ea80, 0xba7b864e, 0x67ed5fcb, 0x409d8afe, 0x9d0b537b, + 0x20c13fb5, 0xfd57e630, 0x8024e068, 0x5db239ed, 0xe0785523, + 0x3dee8ca6}, + {0x00000000, 0x9ba54c6f, 0xec3b9e9f, 0x779ed2f0, 0x03063b7f, + 0x98a37710, 0xef3da5e0, 0x7498e98f, 0x060c76fe, 0x9da93a91, + 0xea37e861, 0x7192a40e, 0x050a4d81, 0x9eaf01ee, 0xe931d31e, + 0x72949f71, 0x0c18edfc, 0x97bda193, 0xe0237363, 0x7b863f0c, + 0x0f1ed683, 0x94bb9aec, 0xe325481c, 0x78800473, 0x0a149b02, + 0x91b1d76d, 0xe62f059d, 0x7d8a49f2, 0x0912a07d, 0x92b7ec12, + 0xe5293ee2, 0x7e8c728d, 0x1831dbf8, 0x83949797, 0xf40a4567, + 0x6faf0908, 0x1b37e087, 0x8092ace8, 0xf70c7e18, 0x6ca93277, + 0x1e3dad06, 0x8598e169, 0xf2063399, 0x69a37ff6, 0x1d3b9679, + 0x869eda16, 0xf10008e6, 0x6aa54489, 0x14293604, 0x8f8c7a6b, + 0xf812a89b, 0x63b7e4f4, 0x172f0d7b, 0x8c8a4114, 0xfb1493e4, + 0x60b1df8b, 0x122540fa, 0x89800c95, 0xfe1ede65, 0x65bb920a, + 0x11237b85, 0x8a8637ea, 0xfd18e51a, 0x66bda975, 0x3063b7f0, + 0xabc6fb9f, 0xdc58296f, 0x47fd6500, 0x33658c8f, 0xa8c0c0e0, + 0xdf5e1210, 0x44fb5e7f, 0x366fc10e, 0xadca8d61, 0xda545f91, + 0x41f113fe, 0x3569fa71, 0xaeccb61e, 0xd95264ee, 0x42f72881, + 0x3c7b5a0c, 0xa7de1663, 0xd040c493, 0x4be588fc, 0x3f7d6173, + 0xa4d82d1c, 0xd346ffec, 0x48e3b383, 0x3a772cf2, 0xa1d2609d, + 0xd64cb26d, 0x4de9fe02, 0x3971178d, 0xa2d45be2, 0xd54a8912, + 0x4eefc57d, 0x28526c08, 0xb3f72067, 0xc469f297, 0x5fccbef8, + 0x2b545777, 0xb0f11b18, 0xc76fc9e8, 0x5cca8587, 0x2e5e1af6, + 0xb5fb5699, 0xc2658469, 0x59c0c806, 0x2d582189, 0xb6fd6de6, + 0xc163bf16, 0x5ac6f379, 0x244a81f4, 0xbfefcd9b, 0xc8711f6b, + 0x53d45304, 0x274cba8b, 0xbce9f6e4, 0xcb772414, 0x50d2687b, + 0x2246f70a, 0xb9e3bb65, 0xce7d6995, 0x55d825fa, 0x2140cc75, + 0xbae5801a, 0xcd7b52ea, 0x56de1e85, 0x60c76fe0, 0xfb62238f, + 0x8cfcf17f, 0x1759bd10, 0x63c1549f, 0xf86418f0, 0x8ffaca00, + 0x145f866f, 0x66cb191e, 0xfd6e5571, 0x8af08781, 0x1155cbee, + 0x65cd2261, 0xfe686e0e, 0x89f6bcfe, 0x1253f091, 0x6cdf821c, + 0xf77ace73, 0x80e41c83, 0x1b4150ec, 0x6fd9b963, 0xf47cf50c, + 0x83e227fc, 0x18476b93, 0x6ad3f4e2, 0xf176b88d, 0x86e86a7d, + 0x1d4d2612, 0x69d5cf9d, 0xf27083f2, 0x85ee5102, 0x1e4b1d6d, + 0x78f6b418, 0xe353f877, 0x94cd2a87, 0x0f6866e8, 0x7bf08f67, + 0xe055c308, 0x97cb11f8, 0x0c6e5d97, 0x7efac2e6, 0xe55f8e89, + 0x92c15c79, 0x09641016, 0x7dfcf999, 0xe659b5f6, 0x91c76706, + 0x0a622b69, 0x74ee59e4, 0xef4b158b, 0x98d5c77b, 0x03708b14, + 0x77e8629b, 0xec4d2ef4, 0x9bd3fc04, 0x0076b06b, 0x72e22f1a, + 0xe9476375, 0x9ed9b185, 0x057cfdea, 0x71e41465, 0xea41580a, + 0x9ddf8afa, 0x067ac695, 0x50a4d810, 0xcb01947f, 0xbc9f468f, + 0x273a0ae0, 0x53a2e36f, 0xc807af00, 0xbf997df0, 0x243c319f, + 0x56a8aeee, 0xcd0de281, 0xba933071, 0x21367c1e, 0x55ae9591, + 0xce0bd9fe, 0xb9950b0e, 0x22304761, 0x5cbc35ec, 0xc7197983, + 0xb087ab73, 0x2b22e71c, 0x5fba0e93, 0xc41f42fc, 0xb381900c, + 0x2824dc63, 0x5ab04312, 0xc1150f7d, 0xb68bdd8d, 0x2d2e91e2, + 0x59b6786d, 0xc2133402, 0xb58de6f2, 0x2e28aa9d, 0x489503e8, + 0xd3304f87, 0xa4ae9d77, 0x3f0bd118, 0x4b933897, 0xd03674f8, + 0xa7a8a608, 0x3c0dea67, 0x4e997516, 0xd53c3979, 0xa2a2eb89, + 0x3907a7e6, 0x4d9f4e69, 0xd63a0206, 0xa1a4d0f6, 0x3a019c99, + 0x448dee14, 0xdf28a27b, 0xa8b6708b, 0x33133ce4, 0x478bd56b, + 0xdc2e9904, 0xabb04bf4, 0x3015079b, 0x428198ea, 0xd924d485, + 0xaeba0675, 0x351f4a1a, 0x4187a395, 0xda22effa, 0xadbc3d0a, + 0x36197165}, + {0x00000000, 0xc18edfc0, 0x586cb9c1, 0x99e26601, 0xb0d97382, + 0x7157ac42, 0xe8b5ca43, 0x293b1583, 0xbac3e145, 0x7b4d3e85, + 0xe2af5884, 0x23218744, 0x0a1a92c7, 0xcb944d07, 0x52762b06, + 0x93f8f4c6, 0xaef6c4cb, 0x6f781b0b, 0xf69a7d0a, 0x3714a2ca, + 0x1e2fb749, 0xdfa16889, 0x46430e88, 0x87cdd148, 0x1435258e, + 0xd5bbfa4e, 0x4c599c4f, 0x8dd7438f, 0xa4ec560c, 0x656289cc, + 0xfc80efcd, 0x3d0e300d, 0x869c8fd7, 0x47125017, 0xdef03616, + 0x1f7ee9d6, 0x3645fc55, 0xf7cb2395, 0x6e294594, 0xafa79a54, + 0x3c5f6e92, 0xfdd1b152, 0x6433d753, 0xa5bd0893, 0x8c861d10, + 0x4d08c2d0, 0xd4eaa4d1, 0x15647b11, 0x286a4b1c, 0xe9e494dc, + 0x7006f2dd, 0xb1882d1d, 0x98b3389e, 0x593de75e, 0xc0df815f, + 0x01515e9f, 0x92a9aa59, 0x53277599, 0xcac51398, 0x0b4bcc58, + 0x2270d9db, 0xe3fe061b, 0x7a1c601a, 0xbb92bfda, 0xd64819ef, + 0x17c6c62f, 0x8e24a02e, 0x4faa7fee, 0x66916a6d, 0xa71fb5ad, + 0x3efdd3ac, 0xff730c6c, 0x6c8bf8aa, 0xad05276a, 0x34e7416b, + 0xf5699eab, 0xdc528b28, 0x1ddc54e8, 0x843e32e9, 0x45b0ed29, + 0x78bedd24, 0xb93002e4, 0x20d264e5, 0xe15cbb25, 0xc867aea6, + 0x09e97166, 0x900b1767, 0x5185c8a7, 0xc27d3c61, 0x03f3e3a1, + 0x9a1185a0, 0x5b9f5a60, 0x72a44fe3, 0xb32a9023, 0x2ac8f622, + 0xeb4629e2, 0x50d49638, 0x915a49f8, 0x08b82ff9, 0xc936f039, + 0xe00de5ba, 0x21833a7a, 0xb8615c7b, 0x79ef83bb, 0xea17777d, + 0x2b99a8bd, 0xb27bcebc, 0x73f5117c, 0x5ace04ff, 0x9b40db3f, + 0x02a2bd3e, 0xc32c62fe, 0xfe2252f3, 0x3fac8d33, 0xa64eeb32, + 0x67c034f2, 0x4efb2171, 0x8f75feb1, 0x169798b0, 0xd7194770, + 0x44e1b3b6, 0x856f6c76, 0x1c8d0a77, 0xdd03d5b7, 0xf438c034, + 0x35b61ff4, 0xac5479f5, 0x6ddaa635, 0x77e1359f, 0xb66fea5f, + 0x2f8d8c5e, 0xee03539e, 0xc738461d, 0x06b699dd, 0x9f54ffdc, + 0x5eda201c, 0xcd22d4da, 0x0cac0b1a, 0x954e6d1b, 0x54c0b2db, + 0x7dfba758, 0xbc757898, 0x25971e99, 0xe419c159, 0xd917f154, + 0x18992e94, 0x817b4895, 0x40f59755, 0x69ce82d6, 0xa8405d16, + 0x31a23b17, 0xf02ce4d7, 0x63d41011, 0xa25acfd1, 0x3bb8a9d0, + 0xfa367610, 0xd30d6393, 0x1283bc53, 0x8b61da52, 0x4aef0592, + 0xf17dba48, 0x30f36588, 0xa9110389, 0x689fdc49, 0x41a4c9ca, + 0x802a160a, 0x19c8700b, 0xd846afcb, 0x4bbe5b0d, 0x8a3084cd, + 0x13d2e2cc, 0xd25c3d0c, 0xfb67288f, 0x3ae9f74f, 0xa30b914e, + 0x62854e8e, 0x5f8b7e83, 0x9e05a143, 0x07e7c742, 0xc6691882, + 0xef520d01, 0x2edcd2c1, 0xb73eb4c0, 0x76b06b00, 0xe5489fc6, + 0x24c64006, 0xbd242607, 0x7caaf9c7, 0x5591ec44, 0x941f3384, + 0x0dfd5585, 0xcc738a45, 0xa1a92c70, 0x6027f3b0, 0xf9c595b1, + 0x384b4a71, 0x11705ff2, 0xd0fe8032, 0x491ce633, 0x889239f3, + 0x1b6acd35, 0xdae412f5, 0x430674f4, 0x8288ab34, 0xabb3beb7, + 0x6a3d6177, 0xf3df0776, 0x3251d8b6, 0x0f5fe8bb, 0xced1377b, + 0x5733517a, 0x96bd8eba, 0xbf869b39, 0x7e0844f9, 0xe7ea22f8, + 0x2664fd38, 0xb59c09fe, 0x7412d63e, 0xedf0b03f, 0x2c7e6fff, + 0x05457a7c, 0xc4cba5bc, 0x5d29c3bd, 0x9ca71c7d, 0x2735a3a7, + 0xe6bb7c67, 0x7f591a66, 0xbed7c5a6, 0x97ecd025, 0x56620fe5, + 0xcf8069e4, 0x0e0eb624, 0x9df642e2, 0x5c789d22, 0xc59afb23, + 0x041424e3, 0x2d2f3160, 0xeca1eea0, 0x754388a1, 0xb4cd5761, + 0x89c3676c, 0x484db8ac, 0xd1afdead, 0x1021016d, 0x391a14ee, + 0xf894cb2e, 0x6176ad2f, 0xa0f872ef, 0x33008629, 0xf28e59e9, + 0x6b6c3fe8, 0xaae2e028, 0x83d9f5ab, 0x42572a6b, 0xdbb54c6a, + 0x1a3b93aa}, + {0x00000000, 0xefc26b3e, 0x04f5d03d, 0xeb37bb03, 0x09eba07a, + 0xe629cb44, 0x0d1e7047, 0xe2dc1b79, 0x13d740f4, 0xfc152bca, + 0x172290c9, 0xf8e0fbf7, 0x1a3ce08e, 0xf5fe8bb0, 0x1ec930b3, + 0xf10b5b8d, 0x27ae81e8, 0xc86cead6, 0x235b51d5, 0xcc993aeb, + 0x2e452192, 0xc1874aac, 0x2ab0f1af, 0xc5729a91, 0x3479c11c, + 0xdbbbaa22, 0x308c1121, 0xdf4e7a1f, 0x3d926166, 0xd2500a58, + 0x3967b15b, 0xd6a5da65, 0x4f5d03d0, 0xa09f68ee, 0x4ba8d3ed, + 0xa46ab8d3, 0x46b6a3aa, 0xa974c894, 0x42437397, 0xad8118a9, + 0x5c8a4324, 0xb348281a, 0x587f9319, 0xb7bdf827, 0x5561e35e, + 0xbaa38860, 0x51943363, 0xbe56585d, 0x68f38238, 0x8731e906, + 0x6c065205, 0x83c4393b, 0x61182242, 0x8eda497c, 0x65edf27f, + 0x8a2f9941, 0x7b24c2cc, 0x94e6a9f2, 0x7fd112f1, 0x901379cf, + 0x72cf62b6, 0x9d0d0988, 0x763ab28b, 0x99f8d9b5, 0x9eba07a0, + 0x71786c9e, 0x9a4fd79d, 0x758dbca3, 0x9751a7da, 0x7893cce4, + 0x93a477e7, 0x7c661cd9, 0x8d6d4754, 0x62af2c6a, 0x89989769, + 0x665afc57, 0x8486e72e, 0x6b448c10, 0x80733713, 0x6fb15c2d, + 0xb9148648, 0x56d6ed76, 0xbde15675, 0x52233d4b, 0xb0ff2632, + 0x5f3d4d0c, 0xb40af60f, 0x5bc89d31, 0xaac3c6bc, 0x4501ad82, + 0xae361681, 0x41f47dbf, 0xa32866c6, 0x4cea0df8, 0xa7ddb6fb, + 0x481fddc5, 0xd1e70470, 0x3e256f4e, 0xd512d44d, 0x3ad0bf73, + 0xd80ca40a, 0x37cecf34, 0xdcf97437, 0x333b1f09, 0xc2304484, + 0x2df22fba, 0xc6c594b9, 0x2907ff87, 0xcbdbe4fe, 0x24198fc0, + 0xcf2e34c3, 0x20ec5ffd, 0xf6498598, 0x198beea6, 0xf2bc55a5, + 0x1d7e3e9b, 0xffa225e2, 0x10604edc, 0xfb57f5df, 0x14959ee1, + 0xe59ec56c, 0x0a5cae52, 0xe16b1551, 0x0ea97e6f, 0xec756516, + 0x03b70e28, 0xe880b52b, 0x0742de15, 0xe6050901, 0x09c7623f, + 0xe2f0d93c, 0x0d32b202, 0xefeea97b, 0x002cc245, 0xeb1b7946, + 0x04d91278, 0xf5d249f5, 0x1a1022cb, 0xf12799c8, 0x1ee5f2f6, + 0xfc39e98f, 0x13fb82b1, 0xf8cc39b2, 0x170e528c, 0xc1ab88e9, + 0x2e69e3d7, 0xc55e58d4, 0x2a9c33ea, 0xc8402893, 0x278243ad, + 0xccb5f8ae, 0x23779390, 0xd27cc81d, 0x3dbea323, 0xd6891820, + 0x394b731e, 0xdb976867, 0x34550359, 0xdf62b85a, 0x30a0d364, + 0xa9580ad1, 0x469a61ef, 0xadaddaec, 0x426fb1d2, 0xa0b3aaab, + 0x4f71c195, 0xa4467a96, 0x4b8411a8, 0xba8f4a25, 0x554d211b, + 0xbe7a9a18, 0x51b8f126, 0xb364ea5f, 0x5ca68161, 0xb7913a62, + 0x5853515c, 0x8ef68b39, 0x6134e007, 0x8a035b04, 0x65c1303a, + 0x871d2b43, 0x68df407d, 0x83e8fb7e, 0x6c2a9040, 0x9d21cbcd, + 0x72e3a0f3, 0x99d41bf0, 0x761670ce, 0x94ca6bb7, 0x7b080089, + 0x903fbb8a, 0x7ffdd0b4, 0x78bf0ea1, 0x977d659f, 0x7c4ade9c, + 0x9388b5a2, 0x7154aedb, 0x9e96c5e5, 0x75a17ee6, 0x9a6315d8, + 0x6b684e55, 0x84aa256b, 0x6f9d9e68, 0x805ff556, 0x6283ee2f, + 0x8d418511, 0x66763e12, 0x89b4552c, 0x5f118f49, 0xb0d3e477, + 0x5be45f74, 0xb426344a, 0x56fa2f33, 0xb938440d, 0x520fff0e, + 0xbdcd9430, 0x4cc6cfbd, 0xa304a483, 0x48331f80, 0xa7f174be, + 0x452d6fc7, 0xaaef04f9, 0x41d8bffa, 0xae1ad4c4, 0x37e20d71, + 0xd820664f, 0x3317dd4c, 0xdcd5b672, 0x3e09ad0b, 0xd1cbc635, + 0x3afc7d36, 0xd53e1608, 0x24354d85, 0xcbf726bb, 0x20c09db8, + 0xcf02f686, 0x2ddeedff, 0xc21c86c1, 0x292b3dc2, 0xc6e956fc, + 0x104c8c99, 0xff8ee7a7, 0x14b95ca4, 0xfb7b379a, 0x19a72ce3, + 0xf66547dd, 0x1d52fcde, 0xf29097e0, 0x039bcc6d, 0xec59a753, + 0x076e1c50, 0xe8ac776e, 0x0a706c17, 0xe5b20729, 0x0e85bc2a, + 0xe147d714}, + {0x00000000, 0x177b1443, 0x2ef62886, 0x398d3cc5, 0x5dec510c, + 0x4a97454f, 0x731a798a, 0x64616dc9, 0xbbd8a218, 0xaca3b65b, + 0x952e8a9e, 0x82559edd, 0xe634f314, 0xf14fe757, 0xc8c2db92, + 0xdfb9cfd1, 0xacc04271, 0xbbbb5632, 0x82366af7, 0x954d7eb4, + 0xf12c137d, 0xe657073e, 0xdfda3bfb, 0xc8a12fb8, 0x1718e069, + 0x0063f42a, 0x39eec8ef, 0x2e95dcac, 0x4af4b165, 0x5d8fa526, + 0x640299e3, 0x73798da0, 0x82f182a3, 0x958a96e0, 0xac07aa25, + 0xbb7cbe66, 0xdf1dd3af, 0xc866c7ec, 0xf1ebfb29, 0xe690ef6a, + 0x392920bb, 0x2e5234f8, 0x17df083d, 0x00a41c7e, 0x64c571b7, + 0x73be65f4, 0x4a335931, 0x5d484d72, 0x2e31c0d2, 0x394ad491, + 0x00c7e854, 0x17bcfc17, 0x73dd91de, 0x64a6859d, 0x5d2bb958, + 0x4a50ad1b, 0x95e962ca, 0x82927689, 0xbb1f4a4c, 0xac645e0f, + 0xc80533c6, 0xdf7e2785, 0xe6f31b40, 0xf1880f03, 0xde920307, + 0xc9e91744, 0xf0642b81, 0xe71f3fc2, 0x837e520b, 0x94054648, + 0xad887a8d, 0xbaf36ece, 0x654aa11f, 0x7231b55c, 0x4bbc8999, + 0x5cc79dda, 0x38a6f013, 0x2fdde450, 0x1650d895, 0x012bccd6, + 0x72524176, 0x65295535, 0x5ca469f0, 0x4bdf7db3, 0x2fbe107a, + 0x38c50439, 0x014838fc, 0x16332cbf, 0xc98ae36e, 0xdef1f72d, + 0xe77ccbe8, 0xf007dfab, 0x9466b262, 0x831da621, 0xba909ae4, + 0xadeb8ea7, 0x5c6381a4, 0x4b1895e7, 0x7295a922, 0x65eebd61, + 0x018fd0a8, 0x16f4c4eb, 0x2f79f82e, 0x3802ec6d, 0xe7bb23bc, + 0xf0c037ff, 0xc94d0b3a, 0xde361f79, 0xba5772b0, 0xad2c66f3, + 0x94a15a36, 0x83da4e75, 0xf0a3c3d5, 0xe7d8d796, 0xde55eb53, + 0xc92eff10, 0xad4f92d9, 0xba34869a, 0x83b9ba5f, 0x94c2ae1c, + 0x4b7b61cd, 0x5c00758e, 0x658d494b, 0x72f65d08, 0x169730c1, + 0x01ec2482, 0x38611847, 0x2f1a0c04, 0x6655004f, 0x712e140c, + 0x48a328c9, 0x5fd83c8a, 0x3bb95143, 0x2cc24500, 0x154f79c5, + 0x02346d86, 0xdd8da257, 0xcaf6b614, 0xf37b8ad1, 0xe4009e92, + 0x8061f35b, 0x971ae718, 0xae97dbdd, 0xb9eccf9e, 0xca95423e, + 0xddee567d, 0xe4636ab8, 0xf3187efb, 0x97791332, 0x80020771, + 0xb98f3bb4, 0xaef42ff7, 0x714de026, 0x6636f465, 0x5fbbc8a0, + 0x48c0dce3, 0x2ca1b12a, 0x3bdaa569, 0x025799ac, 0x152c8def, + 0xe4a482ec, 0xf3df96af, 0xca52aa6a, 0xdd29be29, 0xb948d3e0, + 0xae33c7a3, 0x97befb66, 0x80c5ef25, 0x5f7c20f4, 0x480734b7, + 0x718a0872, 0x66f11c31, 0x029071f8, 0x15eb65bb, 0x2c66597e, + 0x3b1d4d3d, 0x4864c09d, 0x5f1fd4de, 0x6692e81b, 0x71e9fc58, + 0x15889191, 0x02f385d2, 0x3b7eb917, 0x2c05ad54, 0xf3bc6285, + 0xe4c776c6, 0xdd4a4a03, 0xca315e40, 0xae503389, 0xb92b27ca, + 0x80a61b0f, 0x97dd0f4c, 0xb8c70348, 0xafbc170b, 0x96312bce, + 0x814a3f8d, 0xe52b5244, 0xf2504607, 0xcbdd7ac2, 0xdca66e81, + 0x031fa150, 0x1464b513, 0x2de989d6, 0x3a929d95, 0x5ef3f05c, + 0x4988e41f, 0x7005d8da, 0x677ecc99, 0x14074139, 0x037c557a, + 0x3af169bf, 0x2d8a7dfc, 0x49eb1035, 0x5e900476, 0x671d38b3, + 0x70662cf0, 0xafdfe321, 0xb8a4f762, 0x8129cba7, 0x9652dfe4, + 0xf233b22d, 0xe548a66e, 0xdcc59aab, 0xcbbe8ee8, 0x3a3681eb, + 0x2d4d95a8, 0x14c0a96d, 0x03bbbd2e, 0x67dad0e7, 0x70a1c4a4, + 0x492cf861, 0x5e57ec22, 0x81ee23f3, 0x969537b0, 0xaf180b75, + 0xb8631f36, 0xdc0272ff, 0xcb7966bc, 0xf2f45a79, 0xe58f4e3a, + 0x96f6c39a, 0x818dd7d9, 0xb800eb1c, 0xaf7bff5f, 0xcb1a9296, + 0xdc6186d5, 0xe5ecba10, 0xf297ae53, 0x2d2e6182, 0x3a5575c1, + 0x03d84904, 0x14a35d47, 0x70c2308e, 0x67b924cd, 0x5e341808, + 0x494f0c4b}}; + +local const z_word_t FAR crc_braid_big_table[][256] = { + {0x0000000000000000, 0x43147b1700000000, 0x8628f62e00000000, + 0xc53c8d3900000000, 0x0c51ec5d00000000, 0x4f45974a00000000, + 0x8a791a7300000000, 0xc96d616400000000, 0x18a2d8bb00000000, + 0x5bb6a3ac00000000, 0x9e8a2e9500000000, 0xdd9e558200000000, + 0x14f334e600000000, 0x57e74ff100000000, 0x92dbc2c800000000, + 0xd1cfb9df00000000, 0x7142c0ac00000000, 0x3256bbbb00000000, + 0xf76a368200000000, 0xb47e4d9500000000, 0x7d132cf100000000, + 0x3e0757e600000000, 0xfb3bdadf00000000, 0xb82fa1c800000000, + 0x69e0181700000000, 0x2af4630000000000, 0xefc8ee3900000000, + 0xacdc952e00000000, 0x65b1f44a00000000, 0x26a58f5d00000000, + 0xe399026400000000, 0xa08d797300000000, 0xa382f18200000000, + 0xe0968a9500000000, 0x25aa07ac00000000, 0x66be7cbb00000000, + 0xafd31ddf00000000, 0xecc766c800000000, 0x29fbebf100000000, + 0x6aef90e600000000, 0xbb20293900000000, 0xf834522e00000000, + 0x3d08df1700000000, 0x7e1ca40000000000, 0xb771c56400000000, + 0xf465be7300000000, 0x3159334a00000000, 0x724d485d00000000, + 0xd2c0312e00000000, 0x91d44a3900000000, 0x54e8c70000000000, + 0x17fcbc1700000000, 0xde91dd7300000000, 0x9d85a66400000000, + 0x58b92b5d00000000, 0x1bad504a00000000, 0xca62e99500000000, + 0x8976928200000000, 0x4c4a1fbb00000000, 0x0f5e64ac00000000, + 0xc63305c800000000, 0x85277edf00000000, 0x401bf3e600000000, + 0x030f88f100000000, 0x070392de00000000, 0x4417e9c900000000, + 0x812b64f000000000, 0xc23f1fe700000000, 0x0b527e8300000000, + 0x4846059400000000, 0x8d7a88ad00000000, 0xce6ef3ba00000000, + 0x1fa14a6500000000, 0x5cb5317200000000, 0x9989bc4b00000000, + 0xda9dc75c00000000, 0x13f0a63800000000, 0x50e4dd2f00000000, + 0x95d8501600000000, 0xd6cc2b0100000000, 0x7641527200000000, + 0x3555296500000000, 0xf069a45c00000000, 0xb37ddf4b00000000, + 0x7a10be2f00000000, 0x3904c53800000000, 0xfc38480100000000, + 0xbf2c331600000000, 0x6ee38ac900000000, 0x2df7f1de00000000, + 0xe8cb7ce700000000, 0xabdf07f000000000, 0x62b2669400000000, + 0x21a61d8300000000, 0xe49a90ba00000000, 0xa78eebad00000000, + 0xa481635c00000000, 0xe795184b00000000, 0x22a9957200000000, + 0x61bdee6500000000, 0xa8d08f0100000000, 0xebc4f41600000000, + 0x2ef8792f00000000, 0x6dec023800000000, 0xbc23bbe700000000, + 0xff37c0f000000000, 0x3a0b4dc900000000, 0x791f36de00000000, + 0xb07257ba00000000, 0xf3662cad00000000, 0x365aa19400000000, + 0x754eda8300000000, 0xd5c3a3f000000000, 0x96d7d8e700000000, + 0x53eb55de00000000, 0x10ff2ec900000000, 0xd9924fad00000000, + 0x9a8634ba00000000, 0x5fbab98300000000, 0x1caec29400000000, + 0xcd617b4b00000000, 0x8e75005c00000000, 0x4b498d6500000000, + 0x085df67200000000, 0xc130971600000000, 0x8224ec0100000000, + 0x4718613800000000, 0x040c1a2f00000000, 0x4f00556600000000, + 0x0c142e7100000000, 0xc928a34800000000, 0x8a3cd85f00000000, + 0x4351b93b00000000, 0x0045c22c00000000, 0xc5794f1500000000, + 0x866d340200000000, 0x57a28ddd00000000, 0x14b6f6ca00000000, + 0xd18a7bf300000000, 0x929e00e400000000, 0x5bf3618000000000, + 0x18e71a9700000000, 0xdddb97ae00000000, 0x9ecfecb900000000, + 0x3e4295ca00000000, 0x7d56eedd00000000, 0xb86a63e400000000, + 0xfb7e18f300000000, 0x3213799700000000, 0x7107028000000000, + 0xb43b8fb900000000, 0xf72ff4ae00000000, 0x26e04d7100000000, + 0x65f4366600000000, 0xa0c8bb5f00000000, 0xe3dcc04800000000, + 0x2ab1a12c00000000, 0x69a5da3b00000000, 0xac99570200000000, + 0xef8d2c1500000000, 0xec82a4e400000000, 0xaf96dff300000000, + 0x6aaa52ca00000000, 0x29be29dd00000000, 0xe0d348b900000000, + 0xa3c733ae00000000, 0x66fbbe9700000000, 0x25efc58000000000, + 0xf4207c5f00000000, 0xb734074800000000, 0x72088a7100000000, + 0x311cf16600000000, 0xf871900200000000, 0xbb65eb1500000000, + 0x7e59662c00000000, 0x3d4d1d3b00000000, 0x9dc0644800000000, + 0xded41f5f00000000, 0x1be8926600000000, 0x58fce97100000000, + 0x9191881500000000, 0xd285f30200000000, 0x17b97e3b00000000, + 0x54ad052c00000000, 0x8562bcf300000000, 0xc676c7e400000000, + 0x034a4add00000000, 0x405e31ca00000000, 0x893350ae00000000, + 0xca272bb900000000, 0x0f1ba68000000000, 0x4c0fdd9700000000, + 0x4803c7b800000000, 0x0b17bcaf00000000, 0xce2b319600000000, + 0x8d3f4a8100000000, 0x44522be500000000, 0x074650f200000000, + 0xc27addcb00000000, 0x816ea6dc00000000, 0x50a11f0300000000, + 0x13b5641400000000, 0xd689e92d00000000, 0x959d923a00000000, + 0x5cf0f35e00000000, 0x1fe4884900000000, 0xdad8057000000000, + 0x99cc7e6700000000, 0x3941071400000000, 0x7a557c0300000000, + 0xbf69f13a00000000, 0xfc7d8a2d00000000, 0x3510eb4900000000, + 0x7604905e00000000, 0xb3381d6700000000, 0xf02c667000000000, + 0x21e3dfaf00000000, 0x62f7a4b800000000, 0xa7cb298100000000, + 0xe4df529600000000, 0x2db233f200000000, 0x6ea648e500000000, + 0xab9ac5dc00000000, 0xe88ebecb00000000, 0xeb81363a00000000, + 0xa8954d2d00000000, 0x6da9c01400000000, 0x2ebdbb0300000000, + 0xe7d0da6700000000, 0xa4c4a17000000000, 0x61f82c4900000000, + 0x22ec575e00000000, 0xf323ee8100000000, 0xb037959600000000, + 0x750b18af00000000, 0x361f63b800000000, 0xff7202dc00000000, + 0xbc6679cb00000000, 0x795af4f200000000, 0x3a4e8fe500000000, + 0x9ac3f69600000000, 0xd9d78d8100000000, 0x1ceb00b800000000, + 0x5fff7baf00000000, 0x96921acb00000000, 0xd58661dc00000000, + 0x10baece500000000, 0x53ae97f200000000, 0x82612e2d00000000, + 0xc175553a00000000, 0x0449d80300000000, 0x475da31400000000, + 0x8e30c27000000000, 0xcd24b96700000000, 0x0818345e00000000, + 0x4b0c4f4900000000}, + {0x0000000000000000, 0x3e6bc2ef00000000, 0x3dd0f50400000000, + 0x03bb37eb00000000, 0x7aa0eb0900000000, 0x44cb29e600000000, + 0x47701e0d00000000, 0x791bdce200000000, 0xf440d71300000000, + 0xca2b15fc00000000, 0xc990221700000000, 0xf7fbe0f800000000, + 0x8ee03c1a00000000, 0xb08bfef500000000, 0xb330c91e00000000, + 0x8d5b0bf100000000, 0xe881ae2700000000, 0xd6ea6cc800000000, + 0xd5515b2300000000, 0xeb3a99cc00000000, 0x9221452e00000000, + 0xac4a87c100000000, 0xaff1b02a00000000, 0x919a72c500000000, + 0x1cc1793400000000, 0x22aabbdb00000000, 0x21118c3000000000, + 0x1f7a4edf00000000, 0x6661923d00000000, 0x580a50d200000000, + 0x5bb1673900000000, 0x65daa5d600000000, 0xd0035d4f00000000, + 0xee689fa000000000, 0xedd3a84b00000000, 0xd3b86aa400000000, + 0xaaa3b64600000000, 0x94c874a900000000, 0x9773434200000000, + 0xa91881ad00000000, 0x24438a5c00000000, 0x1a2848b300000000, + 0x19937f5800000000, 0x27f8bdb700000000, 0x5ee3615500000000, + 0x6088a3ba00000000, 0x6333945100000000, 0x5d5856be00000000, + 0x3882f36800000000, 0x06e9318700000000, 0x0552066c00000000, + 0x3b39c48300000000, 0x4222186100000000, 0x7c49da8e00000000, + 0x7ff2ed6500000000, 0x41992f8a00000000, 0xccc2247b00000000, + 0xf2a9e69400000000, 0xf112d17f00000000, 0xcf79139000000000, + 0xb662cf7200000000, 0x88090d9d00000000, 0x8bb23a7600000000, + 0xb5d9f89900000000, 0xa007ba9e00000000, 0x9e6c787100000000, + 0x9dd74f9a00000000, 0xa3bc8d7500000000, 0xdaa7519700000000, + 0xe4cc937800000000, 0xe777a49300000000, 0xd91c667c00000000, + 0x54476d8d00000000, 0x6a2caf6200000000, 0x6997988900000000, + 0x57fc5a6600000000, 0x2ee7868400000000, 0x108c446b00000000, + 0x1337738000000000, 0x2d5cb16f00000000, 0x488614b900000000, + 0x76edd65600000000, 0x7556e1bd00000000, 0x4b3d235200000000, + 0x3226ffb000000000, 0x0c4d3d5f00000000, 0x0ff60ab400000000, + 0x319dc85b00000000, 0xbcc6c3aa00000000, 0x82ad014500000000, + 0x811636ae00000000, 0xbf7df44100000000, 0xc66628a300000000, + 0xf80dea4c00000000, 0xfbb6dda700000000, 0xc5dd1f4800000000, + 0x7004e7d100000000, 0x4e6f253e00000000, 0x4dd412d500000000, + 0x73bfd03a00000000, 0x0aa40cd800000000, 0x34cfce3700000000, + 0x3774f9dc00000000, 0x091f3b3300000000, 0x844430c200000000, + 0xba2ff22d00000000, 0xb994c5c600000000, 0x87ff072900000000, + 0xfee4dbcb00000000, 0xc08f192400000000, 0xc3342ecf00000000, + 0xfd5fec2000000000, 0x988549f600000000, 0xa6ee8b1900000000, + 0xa555bcf200000000, 0x9b3e7e1d00000000, 0xe225a2ff00000000, + 0xdc4e601000000000, 0xdff557fb00000000, 0xe19e951400000000, + 0x6cc59ee500000000, 0x52ae5c0a00000000, 0x51156be100000000, + 0x6f7ea90e00000000, 0x166575ec00000000, 0x280eb70300000000, + 0x2bb580e800000000, 0x15de420700000000, 0x010905e600000000, + 0x3f62c70900000000, 0x3cd9f0e200000000, 0x02b2320d00000000, + 0x7ba9eeef00000000, 0x45c22c0000000000, 0x46791beb00000000, + 0x7812d90400000000, 0xf549d2f500000000, 0xcb22101a00000000, + 0xc89927f100000000, 0xf6f2e51e00000000, 0x8fe939fc00000000, + 0xb182fb1300000000, 0xb239ccf800000000, 0x8c520e1700000000, + 0xe988abc100000000, 0xd7e3692e00000000, 0xd4585ec500000000, + 0xea339c2a00000000, 0x932840c800000000, 0xad43822700000000, + 0xaef8b5cc00000000, 0x9093772300000000, 0x1dc87cd200000000, + 0x23a3be3d00000000, 0x201889d600000000, 0x1e734b3900000000, + 0x676897db00000000, 0x5903553400000000, 0x5ab862df00000000, + 0x64d3a03000000000, 0xd10a58a900000000, 0xef619a4600000000, + 0xecdaadad00000000, 0xd2b16f4200000000, 0xabaab3a000000000, + 0x95c1714f00000000, 0x967a46a400000000, 0xa811844b00000000, + 0x254a8fba00000000, 0x1b214d5500000000, 0x189a7abe00000000, + 0x26f1b85100000000, 0x5fea64b300000000, 0x6181a65c00000000, + 0x623a91b700000000, 0x5c51535800000000, 0x398bf68e00000000, + 0x07e0346100000000, 0x045b038a00000000, 0x3a30c16500000000, + 0x432b1d8700000000, 0x7d40df6800000000, 0x7efbe88300000000, + 0x40902a6c00000000, 0xcdcb219d00000000, 0xf3a0e37200000000, + 0xf01bd49900000000, 0xce70167600000000, 0xb76bca9400000000, + 0x8900087b00000000, 0x8abb3f9000000000, 0xb4d0fd7f00000000, + 0xa10ebf7800000000, 0x9f657d9700000000, 0x9cde4a7c00000000, + 0xa2b5889300000000, 0xdbae547100000000, 0xe5c5969e00000000, + 0xe67ea17500000000, 0xd815639a00000000, 0x554e686b00000000, + 0x6b25aa8400000000, 0x689e9d6f00000000, 0x56f55f8000000000, + 0x2fee836200000000, 0x1185418d00000000, 0x123e766600000000, + 0x2c55b48900000000, 0x498f115f00000000, 0x77e4d3b000000000, + 0x745fe45b00000000, 0x4a3426b400000000, 0x332ffa5600000000, + 0x0d4438b900000000, 0x0eff0f5200000000, 0x3094cdbd00000000, + 0xbdcfc64c00000000, 0x83a404a300000000, 0x801f334800000000, + 0xbe74f1a700000000, 0xc76f2d4500000000, 0xf904efaa00000000, + 0xfabfd84100000000, 0xc4d41aae00000000, 0x710de23700000000, + 0x4f6620d800000000, 0x4cdd173300000000, 0x72b6d5dc00000000, + 0x0bad093e00000000, 0x35c6cbd100000000, 0x367dfc3a00000000, + 0x08163ed500000000, 0x854d352400000000, 0xbb26f7cb00000000, + 0xb89dc02000000000, 0x86f602cf00000000, 0xffedde2d00000000, + 0xc1861cc200000000, 0xc23d2b2900000000, 0xfc56e9c600000000, + 0x998c4c1000000000, 0xa7e78eff00000000, 0xa45cb91400000000, + 0x9a377bfb00000000, 0xe32ca71900000000, 0xdd4765f600000000, + 0xdefc521d00000000, 0xe09790f200000000, 0x6dcc9b0300000000, + 0x53a759ec00000000, 0x501c6e0700000000, 0x6e77ace800000000, + 0x176c700a00000000, 0x2907b2e500000000, 0x2abc850e00000000, + 0x14d747e100000000}, + {0x0000000000000000, 0xc0df8ec100000000, 0xc1b96c5800000000, + 0x0166e29900000000, 0x8273d9b000000000, 0x42ac577100000000, + 0x43cab5e800000000, 0x83153b2900000000, 0x45e1c3ba00000000, + 0x853e4d7b00000000, 0x8458afe200000000, 0x4487212300000000, + 0xc7921a0a00000000, 0x074d94cb00000000, 0x062b765200000000, + 0xc6f4f89300000000, 0xcbc4f6ae00000000, 0x0b1b786f00000000, + 0x0a7d9af600000000, 0xcaa2143700000000, 0x49b72f1e00000000, + 0x8968a1df00000000, 0x880e434600000000, 0x48d1cd8700000000, + 0x8e25351400000000, 0x4efabbd500000000, 0x4f9c594c00000000, + 0x8f43d78d00000000, 0x0c56eca400000000, 0xcc89626500000000, + 0xcdef80fc00000000, 0x0d300e3d00000000, 0xd78f9c8600000000, + 0x1750124700000000, 0x1636f0de00000000, 0xd6e97e1f00000000, + 0x55fc453600000000, 0x9523cbf700000000, 0x9445296e00000000, + 0x549aa7af00000000, 0x926e5f3c00000000, 0x52b1d1fd00000000, + 0x53d7336400000000, 0x9308bda500000000, 0x101d868c00000000, + 0xd0c2084d00000000, 0xd1a4ead400000000, 0x117b641500000000, + 0x1c4b6a2800000000, 0xdc94e4e900000000, 0xddf2067000000000, + 0x1d2d88b100000000, 0x9e38b39800000000, 0x5ee73d5900000000, + 0x5f81dfc000000000, 0x9f5e510100000000, 0x59aaa99200000000, + 0x9975275300000000, 0x9813c5ca00000000, 0x58cc4b0b00000000, + 0xdbd9702200000000, 0x1b06fee300000000, 0x1a601c7a00000000, + 0xdabf92bb00000000, 0xef1948d600000000, 0x2fc6c61700000000, + 0x2ea0248e00000000, 0xee7faa4f00000000, 0x6d6a916600000000, + 0xadb51fa700000000, 0xacd3fd3e00000000, 0x6c0c73ff00000000, + 0xaaf88b6c00000000, 0x6a2705ad00000000, 0x6b41e73400000000, + 0xab9e69f500000000, 0x288b52dc00000000, 0xe854dc1d00000000, + 0xe9323e8400000000, 0x29edb04500000000, 0x24ddbe7800000000, + 0xe40230b900000000, 0xe564d22000000000, 0x25bb5ce100000000, + 0xa6ae67c800000000, 0x6671e90900000000, 0x67170b9000000000, + 0xa7c8855100000000, 0x613c7dc200000000, 0xa1e3f30300000000, + 0xa085119a00000000, 0x605a9f5b00000000, 0xe34fa47200000000, + 0x23902ab300000000, 0x22f6c82a00000000, 0xe22946eb00000000, + 0x3896d45000000000, 0xf8495a9100000000, 0xf92fb80800000000, + 0x39f036c900000000, 0xbae50de000000000, 0x7a3a832100000000, + 0x7b5c61b800000000, 0xbb83ef7900000000, 0x7d7717ea00000000, + 0xbda8992b00000000, 0xbcce7bb200000000, 0x7c11f57300000000, + 0xff04ce5a00000000, 0x3fdb409b00000000, 0x3ebda20200000000, + 0xfe622cc300000000, 0xf35222fe00000000, 0x338dac3f00000000, + 0x32eb4ea600000000, 0xf234c06700000000, 0x7121fb4e00000000, + 0xb1fe758f00000000, 0xb098971600000000, 0x704719d700000000, + 0xb6b3e14400000000, 0x766c6f8500000000, 0x770a8d1c00000000, + 0xb7d503dd00000000, 0x34c038f400000000, 0xf41fb63500000000, + 0xf57954ac00000000, 0x35a6da6d00000000, 0x9f35e17700000000, + 0x5fea6fb600000000, 0x5e8c8d2f00000000, 0x9e5303ee00000000, + 0x1d4638c700000000, 0xdd99b60600000000, 0xdcff549f00000000, + 0x1c20da5e00000000, 0xdad422cd00000000, 0x1a0bac0c00000000, + 0x1b6d4e9500000000, 0xdbb2c05400000000, 0x58a7fb7d00000000, + 0x987875bc00000000, 0x991e972500000000, 0x59c119e400000000, + 0x54f117d900000000, 0x942e991800000000, 0x95487b8100000000, + 0x5597f54000000000, 0xd682ce6900000000, 0x165d40a800000000, + 0x173ba23100000000, 0xd7e42cf000000000, 0x1110d46300000000, + 0xd1cf5aa200000000, 0xd0a9b83b00000000, 0x107636fa00000000, + 0x93630dd300000000, 0x53bc831200000000, 0x52da618b00000000, + 0x9205ef4a00000000, 0x48ba7df100000000, 0x8865f33000000000, + 0x890311a900000000, 0x49dc9f6800000000, 0xcac9a44100000000, + 0x0a162a8000000000, 0x0b70c81900000000, 0xcbaf46d800000000, + 0x0d5bbe4b00000000, 0xcd84308a00000000, 0xcce2d21300000000, + 0x0c3d5cd200000000, 0x8f2867fb00000000, 0x4ff7e93a00000000, + 0x4e910ba300000000, 0x8e4e856200000000, 0x837e8b5f00000000, + 0x43a1059e00000000, 0x42c7e70700000000, 0x821869c600000000, + 0x010d52ef00000000, 0xc1d2dc2e00000000, 0xc0b43eb700000000, + 0x006bb07600000000, 0xc69f48e500000000, 0x0640c62400000000, + 0x072624bd00000000, 0xc7f9aa7c00000000, 0x44ec915500000000, + 0x84331f9400000000, 0x8555fd0d00000000, 0x458a73cc00000000, + 0x702ca9a100000000, 0xb0f3276000000000, 0xb195c5f900000000, + 0x714a4b3800000000, 0xf25f701100000000, 0x3280fed000000000, + 0x33e61c4900000000, 0xf339928800000000, 0x35cd6a1b00000000, + 0xf512e4da00000000, 0xf474064300000000, 0x34ab888200000000, + 0xb7beb3ab00000000, 0x77613d6a00000000, 0x7607dff300000000, + 0xb6d8513200000000, 0xbbe85f0f00000000, 0x7b37d1ce00000000, + 0x7a51335700000000, 0xba8ebd9600000000, 0x399b86bf00000000, + 0xf944087e00000000, 0xf822eae700000000, 0x38fd642600000000, + 0xfe099cb500000000, 0x3ed6127400000000, 0x3fb0f0ed00000000, + 0xff6f7e2c00000000, 0x7c7a450500000000, 0xbca5cbc400000000, + 0xbdc3295d00000000, 0x7d1ca79c00000000, 0xa7a3352700000000, + 0x677cbbe600000000, 0x661a597f00000000, 0xa6c5d7be00000000, + 0x25d0ec9700000000, 0xe50f625600000000, 0xe46980cf00000000, + 0x24b60e0e00000000, 0xe242f69d00000000, 0x229d785c00000000, + 0x23fb9ac500000000, 0xe324140400000000, 0x60312f2d00000000, + 0xa0eea1ec00000000, 0xa188437500000000, 0x6157cdb400000000, + 0x6c67c38900000000, 0xacb84d4800000000, 0xaddeafd100000000, + 0x6d01211000000000, 0xee141a3900000000, 0x2ecb94f800000000, + 0x2fad766100000000, 0xef72f8a000000000, 0x2986003300000000, + 0xe9598ef200000000, 0xe83f6c6b00000000, 0x28e0e2aa00000000, + 0xabf5d98300000000, 0x6b2a574200000000, 0x6a4cb5db00000000, + 0xaa933b1a00000000}, + {0x0000000000000000, 0x6f4ca59b00000000, 0x9f9e3bec00000000, + 0xf0d29e7700000000, 0x7f3b060300000000, 0x1077a39800000000, + 0xe0a53def00000000, 0x8fe9987400000000, 0xfe760c0600000000, + 0x913aa99d00000000, 0x61e837ea00000000, 0x0ea4927100000000, + 0x814d0a0500000000, 0xee01af9e00000000, 0x1ed331e900000000, + 0x719f947200000000, 0xfced180c00000000, 0x93a1bd9700000000, + 0x637323e000000000, 0x0c3f867b00000000, 0x83d61e0f00000000, + 0xec9abb9400000000, 0x1c4825e300000000, 0x7304807800000000, + 0x029b140a00000000, 0x6dd7b19100000000, 0x9d052fe600000000, + 0xf2498a7d00000000, 0x7da0120900000000, 0x12ecb79200000000, + 0xe23e29e500000000, 0x8d728c7e00000000, 0xf8db311800000000, + 0x9797948300000000, 0x67450af400000000, 0x0809af6f00000000, + 0x87e0371b00000000, 0xe8ac928000000000, 0x187e0cf700000000, + 0x7732a96c00000000, 0x06ad3d1e00000000, 0x69e1988500000000, + 0x993306f200000000, 0xf67fa36900000000, 0x79963b1d00000000, + 0x16da9e8600000000, 0xe60800f100000000, 0x8944a56a00000000, + 0x0436291400000000, 0x6b7a8c8f00000000, 0x9ba812f800000000, + 0xf4e4b76300000000, 0x7b0d2f1700000000, 0x14418a8c00000000, + 0xe49314fb00000000, 0x8bdfb16000000000, 0xfa40251200000000, + 0x950c808900000000, 0x65de1efe00000000, 0x0a92bb6500000000, + 0x857b231100000000, 0xea37868a00000000, 0x1ae518fd00000000, + 0x75a9bd6600000000, 0xf0b7633000000000, 0x9ffbc6ab00000000, + 0x6f2958dc00000000, 0x0065fd4700000000, 0x8f8c653300000000, + 0xe0c0c0a800000000, 0x10125edf00000000, 0x7f5efb4400000000, + 0x0ec16f3600000000, 0x618dcaad00000000, 0x915f54da00000000, + 0xfe13f14100000000, 0x71fa693500000000, 0x1eb6ccae00000000, + 0xee6452d900000000, 0x8128f74200000000, 0x0c5a7b3c00000000, + 0x6316dea700000000, 0x93c440d000000000, 0xfc88e54b00000000, + 0x73617d3f00000000, 0x1c2dd8a400000000, 0xecff46d300000000, + 0x83b3e34800000000, 0xf22c773a00000000, 0x9d60d2a100000000, + 0x6db24cd600000000, 0x02fee94d00000000, 0x8d17713900000000, + 0xe25bd4a200000000, 0x12894ad500000000, 0x7dc5ef4e00000000, + 0x086c522800000000, 0x6720f7b300000000, 0x97f269c400000000, + 0xf8becc5f00000000, 0x7757542b00000000, 0x181bf1b000000000, + 0xe8c96fc700000000, 0x8785ca5c00000000, 0xf61a5e2e00000000, + 0x9956fbb500000000, 0x698465c200000000, 0x06c8c05900000000, + 0x8921582d00000000, 0xe66dfdb600000000, 0x16bf63c100000000, + 0x79f3c65a00000000, 0xf4814a2400000000, 0x9bcdefbf00000000, + 0x6b1f71c800000000, 0x0453d45300000000, 0x8bba4c2700000000, + 0xe4f6e9bc00000000, 0x142477cb00000000, 0x7b68d25000000000, + 0x0af7462200000000, 0x65bbe3b900000000, 0x95697dce00000000, + 0xfa25d85500000000, 0x75cc402100000000, 0x1a80e5ba00000000, + 0xea527bcd00000000, 0x851ede5600000000, 0xe06fc76000000000, + 0x8f2362fb00000000, 0x7ff1fc8c00000000, 0x10bd591700000000, + 0x9f54c16300000000, 0xf01864f800000000, 0x00cafa8f00000000, + 0x6f865f1400000000, 0x1e19cb6600000000, 0x71556efd00000000, + 0x8187f08a00000000, 0xeecb551100000000, 0x6122cd6500000000, + 0x0e6e68fe00000000, 0xfebcf68900000000, 0x91f0531200000000, + 0x1c82df6c00000000, 0x73ce7af700000000, 0x831ce48000000000, + 0xec50411b00000000, 0x63b9d96f00000000, 0x0cf57cf400000000, + 0xfc27e28300000000, 0x936b471800000000, 0xe2f4d36a00000000, + 0x8db876f100000000, 0x7d6ae88600000000, 0x12264d1d00000000, + 0x9dcfd56900000000, 0xf28370f200000000, 0x0251ee8500000000, + 0x6d1d4b1e00000000, 0x18b4f67800000000, 0x77f853e300000000, + 0x872acd9400000000, 0xe866680f00000000, 0x678ff07b00000000, + 0x08c355e000000000, 0xf811cb9700000000, 0x975d6e0c00000000, + 0xe6c2fa7e00000000, 0x898e5fe500000000, 0x795cc19200000000, + 0x1610640900000000, 0x99f9fc7d00000000, 0xf6b559e600000000, + 0x0667c79100000000, 0x692b620a00000000, 0xe459ee7400000000, + 0x8b154bef00000000, 0x7bc7d59800000000, 0x148b700300000000, + 0x9b62e87700000000, 0xf42e4dec00000000, 0x04fcd39b00000000, + 0x6bb0760000000000, 0x1a2fe27200000000, 0x756347e900000000, + 0x85b1d99e00000000, 0xeafd7c0500000000, 0x6514e47100000000, + 0x0a5841ea00000000, 0xfa8adf9d00000000, 0x95c67a0600000000, + 0x10d8a45000000000, 0x7f9401cb00000000, 0x8f469fbc00000000, + 0xe00a3a2700000000, 0x6fe3a25300000000, 0x00af07c800000000, + 0xf07d99bf00000000, 0x9f313c2400000000, 0xeeaea85600000000, + 0x81e20dcd00000000, 0x713093ba00000000, 0x1e7c362100000000, + 0x9195ae5500000000, 0xfed90bce00000000, 0x0e0b95b900000000, + 0x6147302200000000, 0xec35bc5c00000000, 0x837919c700000000, + 0x73ab87b000000000, 0x1ce7222b00000000, 0x930eba5f00000000, + 0xfc421fc400000000, 0x0c9081b300000000, 0x63dc242800000000, + 0x1243b05a00000000, 0x7d0f15c100000000, 0x8ddd8bb600000000, + 0xe2912e2d00000000, 0x6d78b65900000000, 0x023413c200000000, + 0xf2e68db500000000, 0x9daa282e00000000, 0xe803954800000000, + 0x874f30d300000000, 0x779daea400000000, 0x18d10b3f00000000, + 0x9738934b00000000, 0xf87436d000000000, 0x08a6a8a700000000, + 0x67ea0d3c00000000, 0x1675994e00000000, 0x79393cd500000000, + 0x89eba2a200000000, 0xe6a7073900000000, 0x694e9f4d00000000, + 0x06023ad600000000, 0xf6d0a4a100000000, 0x999c013a00000000, + 0x14ee8d4400000000, 0x7ba228df00000000, 0x8b70b6a800000000, + 0xe43c133300000000, 0x6bd58b4700000000, 0x04992edc00000000, + 0xf44bb0ab00000000, 0x9b07153000000000, 0xea98814200000000, + 0x85d424d900000000, 0x7506baae00000000, 0x1a4a1f3500000000, + 0x95a3874100000000, 0xfaef22da00000000, 0x0a3dbcad00000000, + 0x6571193600000000}, + {0x0000000000000000, 0x85d996dd00000000, 0x4bb55c6000000000, + 0xce6ccabd00000000, 0x966ab9c000000000, 0x13b32f1d00000000, + 0xdddfe5a000000000, 0x5806737d00000000, 0x6dd3035a00000000, + 0xe80a958700000000, 0x26665f3a00000000, 0xa3bfc9e700000000, + 0xfbb9ba9a00000000, 0x7e602c4700000000, 0xb00ce6fa00000000, + 0x35d5702700000000, 0xdaa607b400000000, 0x5f7f916900000000, + 0x91135bd400000000, 0x14cacd0900000000, 0x4cccbe7400000000, + 0xc91528a900000000, 0x0779e21400000000, 0x82a074c900000000, + 0xb77504ee00000000, 0x32ac923300000000, 0xfcc0588e00000000, + 0x7919ce5300000000, 0x211fbd2e00000000, 0xa4c62bf300000000, + 0x6aaae14e00000000, 0xef73779300000000, 0xf54b7eb300000000, + 0x7092e86e00000000, 0xbefe22d300000000, 0x3b27b40e00000000, + 0x6321c77300000000, 0xe6f851ae00000000, 0x28949b1300000000, + 0xad4d0dce00000000, 0x98987de900000000, 0x1d41eb3400000000, + 0xd32d218900000000, 0x56f4b75400000000, 0x0ef2c42900000000, + 0x8b2b52f400000000, 0x4547984900000000, 0xc09e0e9400000000, + 0x2fed790700000000, 0xaa34efda00000000, 0x6458256700000000, + 0xe181b3ba00000000, 0xb987c0c700000000, 0x3c5e561a00000000, + 0xf2329ca700000000, 0x77eb0a7a00000000, 0x423e7a5d00000000, + 0xc7e7ec8000000000, 0x098b263d00000000, 0x8c52b0e000000000, + 0xd454c39d00000000, 0x518d554000000000, 0x9fe19ffd00000000, + 0x1a38092000000000, 0xab918dbd00000000, 0x2e481b6000000000, + 0xe024d1dd00000000, 0x65fd470000000000, 0x3dfb347d00000000, + 0xb822a2a000000000, 0x764e681d00000000, 0xf397fec000000000, + 0xc6428ee700000000, 0x439b183a00000000, 0x8df7d28700000000, + 0x082e445a00000000, 0x5028372700000000, 0xd5f1a1fa00000000, + 0x1b9d6b4700000000, 0x9e44fd9a00000000, 0x71378a0900000000, + 0xf4ee1cd400000000, 0x3a82d66900000000, 0xbf5b40b400000000, + 0xe75d33c900000000, 0x6284a51400000000, 0xace86fa900000000, + 0x2931f97400000000, 0x1ce4895300000000, 0x993d1f8e00000000, + 0x5751d53300000000, 0xd28843ee00000000, 0x8a8e309300000000, + 0x0f57a64e00000000, 0xc13b6cf300000000, 0x44e2fa2e00000000, + 0x5edaf30e00000000, 0xdb0365d300000000, 0x156faf6e00000000, + 0x90b639b300000000, 0xc8b04ace00000000, 0x4d69dc1300000000, + 0x830516ae00000000, 0x06dc807300000000, 0x3309f05400000000, + 0xb6d0668900000000, 0x78bcac3400000000, 0xfd653ae900000000, + 0xa563499400000000, 0x20badf4900000000, 0xeed615f400000000, + 0x6b0f832900000000, 0x847cf4ba00000000, 0x01a5626700000000, + 0xcfc9a8da00000000, 0x4a103e0700000000, 0x12164d7a00000000, + 0x97cfdba700000000, 0x59a3111a00000000, 0xdc7a87c700000000, + 0xe9aff7e000000000, 0x6c76613d00000000, 0xa21aab8000000000, + 0x27c33d5d00000000, 0x7fc54e2000000000, 0xfa1cd8fd00000000, + 0x3470124000000000, 0xb1a9849d00000000, 0x17256aa000000000, + 0x92fcfc7d00000000, 0x5c9036c000000000, 0xd949a01d00000000, + 0x814fd36000000000, 0x049645bd00000000, 0xcafa8f0000000000, + 0x4f2319dd00000000, 0x7af669fa00000000, 0xff2fff2700000000, + 0x3143359a00000000, 0xb49aa34700000000, 0xec9cd03a00000000, + 0x694546e700000000, 0xa7298c5a00000000, 0x22f01a8700000000, + 0xcd836d1400000000, 0x485afbc900000000, 0x8636317400000000, + 0x03efa7a900000000, 0x5be9d4d400000000, 0xde30420900000000, + 0x105c88b400000000, 0x95851e6900000000, 0xa0506e4e00000000, + 0x2589f89300000000, 0xebe5322e00000000, 0x6e3ca4f300000000, + 0x363ad78e00000000, 0xb3e3415300000000, 0x7d8f8bee00000000, + 0xf8561d3300000000, 0xe26e141300000000, 0x67b782ce00000000, + 0xa9db487300000000, 0x2c02deae00000000, 0x7404add300000000, + 0xf1dd3b0e00000000, 0x3fb1f1b300000000, 0xba68676e00000000, + 0x8fbd174900000000, 0x0a64819400000000, 0xc4084b2900000000, + 0x41d1ddf400000000, 0x19d7ae8900000000, 0x9c0e385400000000, + 0x5262f2e900000000, 0xd7bb643400000000, 0x38c813a700000000, + 0xbd11857a00000000, 0x737d4fc700000000, 0xf6a4d91a00000000, + 0xaea2aa6700000000, 0x2b7b3cba00000000, 0xe517f60700000000, + 0x60ce60da00000000, 0x551b10fd00000000, 0xd0c2862000000000, + 0x1eae4c9d00000000, 0x9b77da4000000000, 0xc371a93d00000000, + 0x46a83fe000000000, 0x88c4f55d00000000, 0x0d1d638000000000, + 0xbcb4e71d00000000, 0x396d71c000000000, 0xf701bb7d00000000, + 0x72d82da000000000, 0x2ade5edd00000000, 0xaf07c80000000000, + 0x616b02bd00000000, 0xe4b2946000000000, 0xd167e44700000000, + 0x54be729a00000000, 0x9ad2b82700000000, 0x1f0b2efa00000000, + 0x470d5d8700000000, 0xc2d4cb5a00000000, 0x0cb801e700000000, + 0x8961973a00000000, 0x6612e0a900000000, 0xe3cb767400000000, + 0x2da7bcc900000000, 0xa87e2a1400000000, 0xf078596900000000, + 0x75a1cfb400000000, 0xbbcd050900000000, 0x3e1493d400000000, + 0x0bc1e3f300000000, 0x8e18752e00000000, 0x4074bf9300000000, + 0xc5ad294e00000000, 0x9dab5a3300000000, 0x1872ccee00000000, + 0xd61e065300000000, 0x53c7908e00000000, 0x49ff99ae00000000, + 0xcc260f7300000000, 0x024ac5ce00000000, 0x8793531300000000, + 0xdf95206e00000000, 0x5a4cb6b300000000, 0x94207c0e00000000, + 0x11f9ead300000000, 0x242c9af400000000, 0xa1f50c2900000000, + 0x6f99c69400000000, 0xea40504900000000, 0xb246233400000000, + 0x379fb5e900000000, 0xf9f37f5400000000, 0x7c2ae98900000000, + 0x93599e1a00000000, 0x168008c700000000, 0xd8ecc27a00000000, + 0x5d3554a700000000, 0x053327da00000000, 0x80eab10700000000, + 0x4e867bba00000000, 0xcb5fed6700000000, 0xfe8a9d4000000000, + 0x7b530b9d00000000, 0xb53fc12000000000, 0x30e657fd00000000, + 0x68e0248000000000, 0xed39b25d00000000, 0x235578e000000000, + 0xa68cee3d00000000}, + {0x0000000000000000, 0x76e10f9d00000000, 0xadc46ee100000000, + 0xdb25617c00000000, 0x1b8fac1900000000, 0x6d6ea38400000000, + 0xb64bc2f800000000, 0xc0aacd6500000000, 0x361e593300000000, + 0x40ff56ae00000000, 0x9bda37d200000000, 0xed3b384f00000000, + 0x2d91f52a00000000, 0x5b70fab700000000, 0x80559bcb00000000, + 0xf6b4945600000000, 0x6c3cb26600000000, 0x1addbdfb00000000, + 0xc1f8dc8700000000, 0xb719d31a00000000, 0x77b31e7f00000000, + 0x015211e200000000, 0xda77709e00000000, 0xac967f0300000000, + 0x5a22eb5500000000, 0x2cc3e4c800000000, 0xf7e685b400000000, + 0x81078a2900000000, 0x41ad474c00000000, 0x374c48d100000000, + 0xec6929ad00000000, 0x9a88263000000000, 0xd87864cd00000000, + 0xae996b5000000000, 0x75bc0a2c00000000, 0x035d05b100000000, + 0xc3f7c8d400000000, 0xb516c74900000000, 0x6e33a63500000000, + 0x18d2a9a800000000, 0xee663dfe00000000, 0x9887326300000000, + 0x43a2531f00000000, 0x35435c8200000000, 0xf5e991e700000000, + 0x83089e7a00000000, 0x582dff0600000000, 0x2eccf09b00000000, + 0xb444d6ab00000000, 0xc2a5d93600000000, 0x1980b84a00000000, + 0x6f61b7d700000000, 0xafcb7ab200000000, 0xd92a752f00000000, + 0x020f145300000000, 0x74ee1bce00000000, 0x825a8f9800000000, + 0xf4bb800500000000, 0x2f9ee17900000000, 0x597feee400000000, + 0x99d5238100000000, 0xef342c1c00000000, 0x34114d6000000000, + 0x42f042fd00000000, 0xf1f7b94100000000, 0x8716b6dc00000000, + 0x5c33d7a000000000, 0x2ad2d83d00000000, 0xea78155800000000, + 0x9c991ac500000000, 0x47bc7bb900000000, 0x315d742400000000, + 0xc7e9e07200000000, 0xb108efef00000000, 0x6a2d8e9300000000, + 0x1ccc810e00000000, 0xdc664c6b00000000, 0xaa8743f600000000, + 0x71a2228a00000000, 0x07432d1700000000, 0x9dcb0b2700000000, + 0xeb2a04ba00000000, 0x300f65c600000000, 0x46ee6a5b00000000, + 0x8644a73e00000000, 0xf0a5a8a300000000, 0x2b80c9df00000000, + 0x5d61c64200000000, 0xabd5521400000000, 0xdd345d8900000000, + 0x06113cf500000000, 0x70f0336800000000, 0xb05afe0d00000000, + 0xc6bbf19000000000, 0x1d9e90ec00000000, 0x6b7f9f7100000000, + 0x298fdd8c00000000, 0x5f6ed21100000000, 0x844bb36d00000000, + 0xf2aabcf000000000, 0x3200719500000000, 0x44e17e0800000000, + 0x9fc41f7400000000, 0xe92510e900000000, 0x1f9184bf00000000, + 0x69708b2200000000, 0xb255ea5e00000000, 0xc4b4e5c300000000, + 0x041e28a600000000, 0x72ff273b00000000, 0xa9da464700000000, + 0xdf3b49da00000000, 0x45b36fea00000000, 0x3352607700000000, + 0xe877010b00000000, 0x9e960e9600000000, 0x5e3cc3f300000000, + 0x28ddcc6e00000000, 0xf3f8ad1200000000, 0x8519a28f00000000, + 0x73ad36d900000000, 0x054c394400000000, 0xde69583800000000, + 0xa88857a500000000, 0x68229ac000000000, 0x1ec3955d00000000, + 0xc5e6f42100000000, 0xb307fbbc00000000, 0xe2ef738300000000, + 0x940e7c1e00000000, 0x4f2b1d6200000000, 0x39ca12ff00000000, + 0xf960df9a00000000, 0x8f81d00700000000, 0x54a4b17b00000000, + 0x2245bee600000000, 0xd4f12ab000000000, 0xa210252d00000000, + 0x7935445100000000, 0x0fd44bcc00000000, 0xcf7e86a900000000, + 0xb99f893400000000, 0x62bae84800000000, 0x145be7d500000000, + 0x8ed3c1e500000000, 0xf832ce7800000000, 0x2317af0400000000, + 0x55f6a09900000000, 0x955c6dfc00000000, 0xe3bd626100000000, + 0x3898031d00000000, 0x4e790c8000000000, 0xb8cd98d600000000, + 0xce2c974b00000000, 0x1509f63700000000, 0x63e8f9aa00000000, + 0xa34234cf00000000, 0xd5a33b5200000000, 0x0e865a2e00000000, + 0x786755b300000000, 0x3a97174e00000000, 0x4c7618d300000000, + 0x975379af00000000, 0xe1b2763200000000, 0x2118bb5700000000, + 0x57f9b4ca00000000, 0x8cdcd5b600000000, 0xfa3dda2b00000000, + 0x0c894e7d00000000, 0x7a6841e000000000, 0xa14d209c00000000, + 0xd7ac2f0100000000, 0x1706e26400000000, 0x61e7edf900000000, + 0xbac28c8500000000, 0xcc23831800000000, 0x56aba52800000000, + 0x204aaab500000000, 0xfb6fcbc900000000, 0x8d8ec45400000000, + 0x4d24093100000000, 0x3bc506ac00000000, 0xe0e067d000000000, + 0x9601684d00000000, 0x60b5fc1b00000000, 0x1654f38600000000, + 0xcd7192fa00000000, 0xbb909d6700000000, 0x7b3a500200000000, + 0x0ddb5f9f00000000, 0xd6fe3ee300000000, 0xa01f317e00000000, + 0x1318cac200000000, 0x65f9c55f00000000, 0xbedca42300000000, + 0xc83dabbe00000000, 0x089766db00000000, 0x7e76694600000000, + 0xa553083a00000000, 0xd3b207a700000000, 0x250693f100000000, + 0x53e79c6c00000000, 0x88c2fd1000000000, 0xfe23f28d00000000, + 0x3e893fe800000000, 0x4868307500000000, 0x934d510900000000, + 0xe5ac5e9400000000, 0x7f2478a400000000, 0x09c5773900000000, + 0xd2e0164500000000, 0xa40119d800000000, 0x64abd4bd00000000, + 0x124adb2000000000, 0xc96fba5c00000000, 0xbf8eb5c100000000, + 0x493a219700000000, 0x3fdb2e0a00000000, 0xe4fe4f7600000000, + 0x921f40eb00000000, 0x52b58d8e00000000, 0x2454821300000000, + 0xff71e36f00000000, 0x8990ecf200000000, 0xcb60ae0f00000000, + 0xbd81a19200000000, 0x66a4c0ee00000000, 0x1045cf7300000000, + 0xd0ef021600000000, 0xa60e0d8b00000000, 0x7d2b6cf700000000, + 0x0bca636a00000000, 0xfd7ef73c00000000, 0x8b9ff8a100000000, + 0x50ba99dd00000000, 0x265b964000000000, 0xe6f15b2500000000, + 0x901054b800000000, 0x4b3535c400000000, 0x3dd43a5900000000, + 0xa75c1c6900000000, 0xd1bd13f400000000, 0x0a98728800000000, + 0x7c797d1500000000, 0xbcd3b07000000000, 0xca32bfed00000000, + 0x1117de9100000000, 0x67f6d10c00000000, 0x9142455a00000000, + 0xe7a34ac700000000, 0x3c862bbb00000000, 0x4a67242600000000, + 0x8acde94300000000, 0xfc2ce6de00000000, 0x270987a200000000, + 0x51e8883f00000000}, + {0x0000000000000000, 0xe8dbfbb900000000, 0x91b186a800000000, + 0x796a7d1100000000, 0x63657c8a00000000, 0x8bbe873300000000, + 0xf2d4fa2200000000, 0x1a0f019b00000000, 0x87cc89cf00000000, + 0x6f17727600000000, 0x167d0f6700000000, 0xfea6f4de00000000, + 0xe4a9f54500000000, 0x0c720efc00000000, 0x751873ed00000000, + 0x9dc3885400000000, 0x4f9f624400000000, 0xa74499fd00000000, + 0xde2ee4ec00000000, 0x36f51f5500000000, 0x2cfa1ece00000000, + 0xc421e57700000000, 0xbd4b986600000000, 0x559063df00000000, + 0xc853eb8b00000000, 0x2088103200000000, 0x59e26d2300000000, + 0xb139969a00000000, 0xab36970100000000, 0x43ed6cb800000000, + 0x3a8711a900000000, 0xd25cea1000000000, 0x9e3ec58800000000, + 0x76e53e3100000000, 0x0f8f432000000000, 0xe754b89900000000, + 0xfd5bb90200000000, 0x158042bb00000000, 0x6cea3faa00000000, + 0x8431c41300000000, 0x19f24c4700000000, 0xf129b7fe00000000, + 0x8843caef00000000, 0x6098315600000000, 0x7a9730cd00000000, + 0x924ccb7400000000, 0xeb26b66500000000, 0x03fd4ddc00000000, + 0xd1a1a7cc00000000, 0x397a5c7500000000, 0x4010216400000000, + 0xa8cbdadd00000000, 0xb2c4db4600000000, 0x5a1f20ff00000000, + 0x23755dee00000000, 0xcbaea65700000000, 0x566d2e0300000000, + 0xbeb6d5ba00000000, 0xc7dca8ab00000000, 0x2f07531200000000, + 0x3508528900000000, 0xddd3a93000000000, 0xa4b9d42100000000, + 0x4c622f9800000000, 0x7d7bfbca00000000, 0x95a0007300000000, + 0xecca7d6200000000, 0x041186db00000000, 0x1e1e874000000000, + 0xf6c57cf900000000, 0x8faf01e800000000, 0x6774fa5100000000, + 0xfab7720500000000, 0x126c89bc00000000, 0x6b06f4ad00000000, + 0x83dd0f1400000000, 0x99d20e8f00000000, 0x7109f53600000000, + 0x0863882700000000, 0xe0b8739e00000000, 0x32e4998e00000000, + 0xda3f623700000000, 0xa3551f2600000000, 0x4b8ee49f00000000, + 0x5181e50400000000, 0xb95a1ebd00000000, 0xc03063ac00000000, + 0x28eb981500000000, 0xb528104100000000, 0x5df3ebf800000000, + 0x249996e900000000, 0xcc426d5000000000, 0xd64d6ccb00000000, + 0x3e96977200000000, 0x47fcea6300000000, 0xaf2711da00000000, + 0xe3453e4200000000, 0x0b9ec5fb00000000, 0x72f4b8ea00000000, + 0x9a2f435300000000, 0x802042c800000000, 0x68fbb97100000000, + 0x1191c46000000000, 0xf94a3fd900000000, 0x6489b78d00000000, + 0x8c524c3400000000, 0xf538312500000000, 0x1de3ca9c00000000, + 0x07eccb0700000000, 0xef3730be00000000, 0x965d4daf00000000, + 0x7e86b61600000000, 0xacda5c0600000000, 0x4401a7bf00000000, + 0x3d6bdaae00000000, 0xd5b0211700000000, 0xcfbf208c00000000, + 0x2764db3500000000, 0x5e0ea62400000000, 0xb6d55d9d00000000, + 0x2b16d5c900000000, 0xc3cd2e7000000000, 0xbaa7536100000000, + 0x527ca8d800000000, 0x4873a94300000000, 0xa0a852fa00000000, + 0xd9c22feb00000000, 0x3119d45200000000, 0xbbf0874e00000000, + 0x532b7cf700000000, 0x2a4101e600000000, 0xc29afa5f00000000, + 0xd895fbc400000000, 0x304e007d00000000, 0x49247d6c00000000, + 0xa1ff86d500000000, 0x3c3c0e8100000000, 0xd4e7f53800000000, + 0xad8d882900000000, 0x4556739000000000, 0x5f59720b00000000, + 0xb78289b200000000, 0xcee8f4a300000000, 0x26330f1a00000000, + 0xf46fe50a00000000, 0x1cb41eb300000000, 0x65de63a200000000, + 0x8d05981b00000000, 0x970a998000000000, 0x7fd1623900000000, + 0x06bb1f2800000000, 0xee60e49100000000, 0x73a36cc500000000, + 0x9b78977c00000000, 0xe212ea6d00000000, 0x0ac911d400000000, + 0x10c6104f00000000, 0xf81debf600000000, 0x817796e700000000, + 0x69ac6d5e00000000, 0x25ce42c600000000, 0xcd15b97f00000000, + 0xb47fc46e00000000, 0x5ca43fd700000000, 0x46ab3e4c00000000, + 0xae70c5f500000000, 0xd71ab8e400000000, 0x3fc1435d00000000, + 0xa202cb0900000000, 0x4ad930b000000000, 0x33b34da100000000, + 0xdb68b61800000000, 0xc167b78300000000, 0x29bc4c3a00000000, + 0x50d6312b00000000, 0xb80dca9200000000, 0x6a51208200000000, + 0x828adb3b00000000, 0xfbe0a62a00000000, 0x133b5d9300000000, + 0x09345c0800000000, 0xe1efa7b100000000, 0x9885daa000000000, + 0x705e211900000000, 0xed9da94d00000000, 0x054652f400000000, + 0x7c2c2fe500000000, 0x94f7d45c00000000, 0x8ef8d5c700000000, + 0x66232e7e00000000, 0x1f49536f00000000, 0xf792a8d600000000, + 0xc68b7c8400000000, 0x2e50873d00000000, 0x573afa2c00000000, + 0xbfe1019500000000, 0xa5ee000e00000000, 0x4d35fbb700000000, + 0x345f86a600000000, 0xdc847d1f00000000, 0x4147f54b00000000, + 0xa99c0ef200000000, 0xd0f673e300000000, 0x382d885a00000000, + 0x222289c100000000, 0xcaf9727800000000, 0xb3930f6900000000, + 0x5b48f4d000000000, 0x89141ec000000000, 0x61cfe57900000000, + 0x18a5986800000000, 0xf07e63d100000000, 0xea71624a00000000, + 0x02aa99f300000000, 0x7bc0e4e200000000, 0x931b1f5b00000000, + 0x0ed8970f00000000, 0xe6036cb600000000, 0x9f6911a700000000, + 0x77b2ea1e00000000, 0x6dbdeb8500000000, 0x8566103c00000000, + 0xfc0c6d2d00000000, 0x14d7969400000000, 0x58b5b90c00000000, + 0xb06e42b500000000, 0xc9043fa400000000, 0x21dfc41d00000000, + 0x3bd0c58600000000, 0xd30b3e3f00000000, 0xaa61432e00000000, + 0x42bab89700000000, 0xdf7930c300000000, 0x37a2cb7a00000000, + 0x4ec8b66b00000000, 0xa6134dd200000000, 0xbc1c4c4900000000, + 0x54c7b7f000000000, 0x2dadcae100000000, 0xc576315800000000, + 0x172adb4800000000, 0xfff120f100000000, 0x869b5de000000000, + 0x6e40a65900000000, 0x744fa7c200000000, 0x9c945c7b00000000, + 0xe5fe216a00000000, 0x0d25dad300000000, 0x90e6528700000000, + 0x783da93e00000000, 0x0157d42f00000000, 0xe98c2f9600000000, + 0xf3832e0d00000000, 0x1b58d5b400000000, 0x6232a8a500000000, + 0x8ae9531c00000000}, + {0x0000000000000000, 0x919168ae00000000, 0x6325a08700000000, + 0xf2b4c82900000000, 0x874c31d400000000, 0x16dd597a00000000, + 0xe469915300000000, 0x75f8f9fd00000000, 0x4f9f137300000000, + 0xde0e7bdd00000000, 0x2cbab3f400000000, 0xbd2bdb5a00000000, + 0xc8d322a700000000, 0x59424a0900000000, 0xabf6822000000000, + 0x3a67ea8e00000000, 0x9e3e27e600000000, 0x0faf4f4800000000, + 0xfd1b876100000000, 0x6c8aefcf00000000, 0x1972163200000000, + 0x88e37e9c00000000, 0x7a57b6b500000000, 0xebc6de1b00000000, + 0xd1a1349500000000, 0x40305c3b00000000, 0xb284941200000000, + 0x2315fcbc00000000, 0x56ed054100000000, 0xc77c6def00000000, + 0x35c8a5c600000000, 0xa459cd6800000000, 0x7d7b3f1700000000, + 0xecea57b900000000, 0x1e5e9f9000000000, 0x8fcff73e00000000, + 0xfa370ec300000000, 0x6ba6666d00000000, 0x9912ae4400000000, + 0x0883c6ea00000000, 0x32e42c6400000000, 0xa37544ca00000000, + 0x51c18ce300000000, 0xc050e44d00000000, 0xb5a81db000000000, + 0x2439751e00000000, 0xd68dbd3700000000, 0x471cd59900000000, + 0xe34518f100000000, 0x72d4705f00000000, 0x8060b87600000000, + 0x11f1d0d800000000, 0x6409292500000000, 0xf598418b00000000, + 0x072c89a200000000, 0x96bde10c00000000, 0xacda0b8200000000, + 0x3d4b632c00000000, 0xcfffab0500000000, 0x5e6ec3ab00000000, + 0x2b963a5600000000, 0xba0752f800000000, 0x48b39ad100000000, + 0xd922f27f00000000, 0xfaf67e2e00000000, 0x6b67168000000000, + 0x99d3dea900000000, 0x0842b60700000000, 0x7dba4ffa00000000, + 0xec2b275400000000, 0x1e9fef7d00000000, 0x8f0e87d300000000, + 0xb5696d5d00000000, 0x24f805f300000000, 0xd64ccdda00000000, + 0x47dda57400000000, 0x32255c8900000000, 0xa3b4342700000000, + 0x5100fc0e00000000, 0xc09194a000000000, 0x64c859c800000000, + 0xf559316600000000, 0x07edf94f00000000, 0x967c91e100000000, + 0xe384681c00000000, 0x721500b200000000, 0x80a1c89b00000000, + 0x1130a03500000000, 0x2b574abb00000000, 0xbac6221500000000, + 0x4872ea3c00000000, 0xd9e3829200000000, 0xac1b7b6f00000000, + 0x3d8a13c100000000, 0xcf3edbe800000000, 0x5eafb34600000000, + 0x878d413900000000, 0x161c299700000000, 0xe4a8e1be00000000, + 0x7539891000000000, 0x00c170ed00000000, 0x9150184300000000, + 0x63e4d06a00000000, 0xf275b8c400000000, 0xc812524a00000000, + 0x59833ae400000000, 0xab37f2cd00000000, 0x3aa69a6300000000, + 0x4f5e639e00000000, 0xdecf0b3000000000, 0x2c7bc31900000000, + 0xbdeaabb700000000, 0x19b366df00000000, 0x88220e7100000000, + 0x7a96c65800000000, 0xeb07aef600000000, 0x9eff570b00000000, + 0x0f6e3fa500000000, 0xfddaf78c00000000, 0x6c4b9f2200000000, + 0x562c75ac00000000, 0xc7bd1d0200000000, 0x3509d52b00000000, + 0xa498bd8500000000, 0xd160447800000000, 0x40f12cd600000000, + 0xb245e4ff00000000, 0x23d48c5100000000, 0xf4edfd5c00000000, + 0x657c95f200000000, 0x97c85ddb00000000, 0x0659357500000000, + 0x73a1cc8800000000, 0xe230a42600000000, 0x10846c0f00000000, + 0x811504a100000000, 0xbb72ee2f00000000, 0x2ae3868100000000, + 0xd8574ea800000000, 0x49c6260600000000, 0x3c3edffb00000000, + 0xadafb75500000000, 0x5f1b7f7c00000000, 0xce8a17d200000000, + 0x6ad3daba00000000, 0xfb42b21400000000, 0x09f67a3d00000000, + 0x9867129300000000, 0xed9feb6e00000000, 0x7c0e83c000000000, + 0x8eba4be900000000, 0x1f2b234700000000, 0x254cc9c900000000, + 0xb4dda16700000000, 0x4669694e00000000, 0xd7f801e000000000, + 0xa200f81d00000000, 0x339190b300000000, 0xc125589a00000000, + 0x50b4303400000000, 0x8996c24b00000000, 0x1807aae500000000, + 0xeab362cc00000000, 0x7b220a6200000000, 0x0edaf39f00000000, + 0x9f4b9b3100000000, 0x6dff531800000000, 0xfc6e3bb600000000, + 0xc609d13800000000, 0x5798b99600000000, 0xa52c71bf00000000, + 0x34bd191100000000, 0x4145e0ec00000000, 0xd0d4884200000000, + 0x2260406b00000000, 0xb3f128c500000000, 0x17a8e5ad00000000, + 0x86398d0300000000, 0x748d452a00000000, 0xe51c2d8400000000, + 0x90e4d47900000000, 0x0175bcd700000000, 0xf3c174fe00000000, + 0x62501c5000000000, 0x5837f6de00000000, 0xc9a69e7000000000, + 0x3b12565900000000, 0xaa833ef700000000, 0xdf7bc70a00000000, + 0x4eeaafa400000000, 0xbc5e678d00000000, 0x2dcf0f2300000000, + 0x0e1b837200000000, 0x9f8aebdc00000000, 0x6d3e23f500000000, + 0xfcaf4b5b00000000, 0x8957b2a600000000, 0x18c6da0800000000, + 0xea72122100000000, 0x7be37a8f00000000, 0x4184900100000000, + 0xd015f8af00000000, 0x22a1308600000000, 0xb330582800000000, + 0xc6c8a1d500000000, 0x5759c97b00000000, 0xa5ed015200000000, + 0x347c69fc00000000, 0x9025a49400000000, 0x01b4cc3a00000000, + 0xf300041300000000, 0x62916cbd00000000, 0x1769954000000000, + 0x86f8fdee00000000, 0x744c35c700000000, 0xe5dd5d6900000000, + 0xdfbab7e700000000, 0x4e2bdf4900000000, 0xbc9f176000000000, + 0x2d0e7fce00000000, 0x58f6863300000000, 0xc967ee9d00000000, + 0x3bd326b400000000, 0xaa424e1a00000000, 0x7360bc6500000000, + 0xe2f1d4cb00000000, 0x10451ce200000000, 0x81d4744c00000000, + 0xf42c8db100000000, 0x65bde51f00000000, 0x97092d3600000000, + 0x0698459800000000, 0x3cffaf1600000000, 0xad6ec7b800000000, + 0x5fda0f9100000000, 0xce4b673f00000000, 0xbbb39ec200000000, + 0x2a22f66c00000000, 0xd8963e4500000000, 0x490756eb00000000, + 0xed5e9b8300000000, 0x7ccff32d00000000, 0x8e7b3b0400000000, + 0x1fea53aa00000000, 0x6a12aa5700000000, 0xfb83c2f900000000, + 0x09370ad000000000, 0x98a6627e00000000, 0xa2c188f000000000, + 0x3350e05e00000000, 0xc1e4287700000000, 0x507540d900000000, + 0x258db92400000000, 0xb41cd18a00000000, 0x46a819a300000000, + 0xd739710d00000000}}; + +#else /* W == 4 */ + +local const z_crc_t FAR crc_braid_table[][256] = { + {0x00000000, 0xccaa009e, 0x4225077d, 0x8e8f07e3, 0x844a0efa, + 0x48e00e64, 0xc66f0987, 0x0ac50919, 0xd3e51bb5, 0x1f4f1b2b, + 0x91c01cc8, 0x5d6a1c56, 0x57af154f, 0x9b0515d1, 0x158a1232, + 0xd92012ac, 0x7cbb312b, 0xb01131b5, 0x3e9e3656, 0xf23436c8, + 0xf8f13fd1, 0x345b3f4f, 0xbad438ac, 0x767e3832, 0xaf5e2a9e, + 0x63f42a00, 0xed7b2de3, 0x21d12d7d, 0x2b142464, 0xe7be24fa, + 0x69312319, 0xa59b2387, 0xf9766256, 0x35dc62c8, 0xbb53652b, + 0x77f965b5, 0x7d3c6cac, 0xb1966c32, 0x3f196bd1, 0xf3b36b4f, + 0x2a9379e3, 0xe639797d, 0x68b67e9e, 0xa41c7e00, 0xaed97719, + 0x62737787, 0xecfc7064, 0x205670fa, 0x85cd537d, 0x496753e3, + 0xc7e85400, 0x0b42549e, 0x01875d87, 0xcd2d5d19, 0x43a25afa, + 0x8f085a64, 0x562848c8, 0x9a824856, 0x140d4fb5, 0xd8a74f2b, + 0xd2624632, 0x1ec846ac, 0x9047414f, 0x5ced41d1, 0x299dc2ed, + 0xe537c273, 0x6bb8c590, 0xa712c50e, 0xadd7cc17, 0x617dcc89, + 0xeff2cb6a, 0x2358cbf4, 0xfa78d958, 0x36d2d9c6, 0xb85dde25, + 0x74f7debb, 0x7e32d7a2, 0xb298d73c, 0x3c17d0df, 0xf0bdd041, + 0x5526f3c6, 0x998cf358, 0x1703f4bb, 0xdba9f425, 0xd16cfd3c, + 0x1dc6fda2, 0x9349fa41, 0x5fe3fadf, 0x86c3e873, 0x4a69e8ed, + 0xc4e6ef0e, 0x084cef90, 0x0289e689, 0xce23e617, 0x40ace1f4, + 0x8c06e16a, 0xd0eba0bb, 0x1c41a025, 0x92cea7c6, 0x5e64a758, + 0x54a1ae41, 0x980baedf, 0x1684a93c, 0xda2ea9a2, 0x030ebb0e, + 0xcfa4bb90, 0x412bbc73, 0x8d81bced, 0x8744b5f4, 0x4beeb56a, + 0xc561b289, 0x09cbb217, 0xac509190, 0x60fa910e, 0xee7596ed, + 0x22df9673, 0x281a9f6a, 0xe4b09ff4, 0x6a3f9817, 0xa6959889, + 0x7fb58a25, 0xb31f8abb, 0x3d908d58, 0xf13a8dc6, 0xfbff84df, + 0x37558441, 0xb9da83a2, 0x7570833c, 0x533b85da, 0x9f918544, + 0x111e82a7, 0xddb48239, 0xd7718b20, 0x1bdb8bbe, 0x95548c5d, + 0x59fe8cc3, 0x80de9e6f, 0x4c749ef1, 0xc2fb9912, 0x0e51998c, + 0x04949095, 0xc83e900b, 0x46b197e8, 0x8a1b9776, 0x2f80b4f1, + 0xe32ab46f, 0x6da5b38c, 0xa10fb312, 0xabcaba0b, 0x6760ba95, + 0xe9efbd76, 0x2545bde8, 0xfc65af44, 0x30cfafda, 0xbe40a839, + 0x72eaa8a7, 0x782fa1be, 0xb485a120, 0x3a0aa6c3, 0xf6a0a65d, + 0xaa4de78c, 0x66e7e712, 0xe868e0f1, 0x24c2e06f, 0x2e07e976, + 0xe2ade9e8, 0x6c22ee0b, 0xa088ee95, 0x79a8fc39, 0xb502fca7, + 0x3b8dfb44, 0xf727fbda, 0xfde2f2c3, 0x3148f25d, 0xbfc7f5be, + 0x736df520, 0xd6f6d6a7, 0x1a5cd639, 0x94d3d1da, 0x5879d144, + 0x52bcd85d, 0x9e16d8c3, 0x1099df20, 0xdc33dfbe, 0x0513cd12, + 0xc9b9cd8c, 0x4736ca6f, 0x8b9ccaf1, 0x8159c3e8, 0x4df3c376, + 0xc37cc495, 0x0fd6c40b, 0x7aa64737, 0xb60c47a9, 0x3883404a, + 0xf42940d4, 0xfeec49cd, 0x32464953, 0xbcc94eb0, 0x70634e2e, + 0xa9435c82, 0x65e95c1c, 0xeb665bff, 0x27cc5b61, 0x2d095278, + 0xe1a352e6, 0x6f2c5505, 0xa386559b, 0x061d761c, 0xcab77682, + 0x44387161, 0x889271ff, 0x825778e6, 0x4efd7878, 0xc0727f9b, + 0x0cd87f05, 0xd5f86da9, 0x19526d37, 0x97dd6ad4, 0x5b776a4a, + 0x51b26353, 0x9d1863cd, 0x1397642e, 0xdf3d64b0, 0x83d02561, + 0x4f7a25ff, 0xc1f5221c, 0x0d5f2282, 0x079a2b9b, 0xcb302b05, + 0x45bf2ce6, 0x89152c78, 0x50353ed4, 0x9c9f3e4a, 0x121039a9, + 0xdeba3937, 0xd47f302e, 0x18d530b0, 0x965a3753, 0x5af037cd, + 0xff6b144a, 0x33c114d4, 0xbd4e1337, 0x71e413a9, 0x7b211ab0, + 0xb78b1a2e, 0x39041dcd, 0xf5ae1d53, 0x2c8e0fff, 0xe0240f61, + 0x6eab0882, 0xa201081c, 0xa8c40105, 0x646e019b, 0xeae10678, + 0x264b06e6}, + {0x00000000, 0xa6770bb4, 0x979f1129, 0x31e81a9d, 0xf44f2413, + 0x52382fa7, 0x63d0353a, 0xc5a73e8e, 0x33ef4e67, 0x959845d3, + 0xa4705f4e, 0x020754fa, 0xc7a06a74, 0x61d761c0, 0x503f7b5d, + 0xf64870e9, 0x67de9cce, 0xc1a9977a, 0xf0418de7, 0x56368653, + 0x9391b8dd, 0x35e6b369, 0x040ea9f4, 0xa279a240, 0x5431d2a9, + 0xf246d91d, 0xc3aec380, 0x65d9c834, 0xa07ef6ba, 0x0609fd0e, + 0x37e1e793, 0x9196ec27, 0xcfbd399c, 0x69ca3228, 0x582228b5, + 0xfe552301, 0x3bf21d8f, 0x9d85163b, 0xac6d0ca6, 0x0a1a0712, + 0xfc5277fb, 0x5a257c4f, 0x6bcd66d2, 0xcdba6d66, 0x081d53e8, + 0xae6a585c, 0x9f8242c1, 0x39f54975, 0xa863a552, 0x0e14aee6, + 0x3ffcb47b, 0x998bbfcf, 0x5c2c8141, 0xfa5b8af5, 0xcbb39068, + 0x6dc49bdc, 0x9b8ceb35, 0x3dfbe081, 0x0c13fa1c, 0xaa64f1a8, + 0x6fc3cf26, 0xc9b4c492, 0xf85cde0f, 0x5e2bd5bb, 0x440b7579, + 0xe27c7ecd, 0xd3946450, 0x75e36fe4, 0xb044516a, 0x16335ade, + 0x27db4043, 0x81ac4bf7, 0x77e43b1e, 0xd19330aa, 0xe07b2a37, + 0x460c2183, 0x83ab1f0d, 0x25dc14b9, 0x14340e24, 0xb2430590, + 0x23d5e9b7, 0x85a2e203, 0xb44af89e, 0x123df32a, 0xd79acda4, + 0x71edc610, 0x4005dc8d, 0xe672d739, 0x103aa7d0, 0xb64dac64, + 0x87a5b6f9, 0x21d2bd4d, 0xe47583c3, 0x42028877, 0x73ea92ea, + 0xd59d995e, 0x8bb64ce5, 0x2dc14751, 0x1c295dcc, 0xba5e5678, + 0x7ff968f6, 0xd98e6342, 0xe86679df, 0x4e11726b, 0xb8590282, + 0x1e2e0936, 0x2fc613ab, 0x89b1181f, 0x4c162691, 0xea612d25, + 0xdb8937b8, 0x7dfe3c0c, 0xec68d02b, 0x4a1fdb9f, 0x7bf7c102, + 0xdd80cab6, 0x1827f438, 0xbe50ff8c, 0x8fb8e511, 0x29cfeea5, + 0xdf879e4c, 0x79f095f8, 0x48188f65, 0xee6f84d1, 0x2bc8ba5f, + 0x8dbfb1eb, 0xbc57ab76, 0x1a20a0c2, 0x8816eaf2, 0x2e61e146, + 0x1f89fbdb, 0xb9fef06f, 0x7c59cee1, 0xda2ec555, 0xebc6dfc8, + 0x4db1d47c, 0xbbf9a495, 0x1d8eaf21, 0x2c66b5bc, 0x8a11be08, + 0x4fb68086, 0xe9c18b32, 0xd82991af, 0x7e5e9a1b, 0xefc8763c, + 0x49bf7d88, 0x78576715, 0xde206ca1, 0x1b87522f, 0xbdf0599b, + 0x8c184306, 0x2a6f48b2, 0xdc27385b, 0x7a5033ef, 0x4bb82972, + 0xedcf22c6, 0x28681c48, 0x8e1f17fc, 0xbff70d61, 0x198006d5, + 0x47abd36e, 0xe1dcd8da, 0xd034c247, 0x7643c9f3, 0xb3e4f77d, + 0x1593fcc9, 0x247be654, 0x820cede0, 0x74449d09, 0xd23396bd, + 0xe3db8c20, 0x45ac8794, 0x800bb91a, 0x267cb2ae, 0x1794a833, + 0xb1e3a387, 0x20754fa0, 0x86024414, 0xb7ea5e89, 0x119d553d, + 0xd43a6bb3, 0x724d6007, 0x43a57a9a, 0xe5d2712e, 0x139a01c7, + 0xb5ed0a73, 0x840510ee, 0x22721b5a, 0xe7d525d4, 0x41a22e60, + 0x704a34fd, 0xd63d3f49, 0xcc1d9f8b, 0x6a6a943f, 0x5b828ea2, + 0xfdf58516, 0x3852bb98, 0x9e25b02c, 0xafcdaab1, 0x09baa105, + 0xfff2d1ec, 0x5985da58, 0x686dc0c5, 0xce1acb71, 0x0bbdf5ff, + 0xadcafe4b, 0x9c22e4d6, 0x3a55ef62, 0xabc30345, 0x0db408f1, + 0x3c5c126c, 0x9a2b19d8, 0x5f8c2756, 0xf9fb2ce2, 0xc813367f, + 0x6e643dcb, 0x982c4d22, 0x3e5b4696, 0x0fb35c0b, 0xa9c457bf, + 0x6c636931, 0xca146285, 0xfbfc7818, 0x5d8b73ac, 0x03a0a617, + 0xa5d7ada3, 0x943fb73e, 0x3248bc8a, 0xf7ef8204, 0x519889b0, + 0x6070932d, 0xc6079899, 0x304fe870, 0x9638e3c4, 0xa7d0f959, + 0x01a7f2ed, 0xc400cc63, 0x6277c7d7, 0x539fdd4a, 0xf5e8d6fe, + 0x647e3ad9, 0xc209316d, 0xf3e12bf0, 0x55962044, 0x90311eca, + 0x3646157e, 0x07ae0fe3, 0xa1d90457, 0x579174be, 0xf1e67f0a, + 0xc00e6597, 0x66796e23, 0xa3de50ad, 0x05a95b19, 0x34414184, + 0x92364a30}, + {0x00000000, 0xcb5cd3a5, 0x4dc8a10b, 0x869472ae, 0x9b914216, + 0x50cd91b3, 0xd659e31d, 0x1d0530b8, 0xec53826d, 0x270f51c8, + 0xa19b2366, 0x6ac7f0c3, 0x77c2c07b, 0xbc9e13de, 0x3a0a6170, + 0xf156b2d5, 0x03d6029b, 0xc88ad13e, 0x4e1ea390, 0x85427035, + 0x9847408d, 0x531b9328, 0xd58fe186, 0x1ed33223, 0xef8580f6, + 0x24d95353, 0xa24d21fd, 0x6911f258, 0x7414c2e0, 0xbf481145, + 0x39dc63eb, 0xf280b04e, 0x07ac0536, 0xccf0d693, 0x4a64a43d, + 0x81387798, 0x9c3d4720, 0x57619485, 0xd1f5e62b, 0x1aa9358e, + 0xebff875b, 0x20a354fe, 0xa6372650, 0x6d6bf5f5, 0x706ec54d, + 0xbb3216e8, 0x3da66446, 0xf6fab7e3, 0x047a07ad, 0xcf26d408, + 0x49b2a6a6, 0x82ee7503, 0x9feb45bb, 0x54b7961e, 0xd223e4b0, + 0x197f3715, 0xe82985c0, 0x23755665, 0xa5e124cb, 0x6ebdf76e, + 0x73b8c7d6, 0xb8e41473, 0x3e7066dd, 0xf52cb578, 0x0f580a6c, + 0xc404d9c9, 0x4290ab67, 0x89cc78c2, 0x94c9487a, 0x5f959bdf, + 0xd901e971, 0x125d3ad4, 0xe30b8801, 0x28575ba4, 0xaec3290a, + 0x659ffaaf, 0x789aca17, 0xb3c619b2, 0x35526b1c, 0xfe0eb8b9, + 0x0c8e08f7, 0xc7d2db52, 0x4146a9fc, 0x8a1a7a59, 0x971f4ae1, + 0x5c439944, 0xdad7ebea, 0x118b384f, 0xe0dd8a9a, 0x2b81593f, + 0xad152b91, 0x6649f834, 0x7b4cc88c, 0xb0101b29, 0x36846987, + 0xfdd8ba22, 0x08f40f5a, 0xc3a8dcff, 0x453cae51, 0x8e607df4, + 0x93654d4c, 0x58399ee9, 0xdeadec47, 0x15f13fe2, 0xe4a78d37, + 0x2ffb5e92, 0xa96f2c3c, 0x6233ff99, 0x7f36cf21, 0xb46a1c84, + 0x32fe6e2a, 0xf9a2bd8f, 0x0b220dc1, 0xc07ede64, 0x46eaacca, + 0x8db67f6f, 0x90b34fd7, 0x5bef9c72, 0xdd7beedc, 0x16273d79, + 0xe7718fac, 0x2c2d5c09, 0xaab92ea7, 0x61e5fd02, 0x7ce0cdba, + 0xb7bc1e1f, 0x31286cb1, 0xfa74bf14, 0x1eb014d8, 0xd5ecc77d, + 0x5378b5d3, 0x98246676, 0x852156ce, 0x4e7d856b, 0xc8e9f7c5, + 0x03b52460, 0xf2e396b5, 0x39bf4510, 0xbf2b37be, 0x7477e41b, + 0x6972d4a3, 0xa22e0706, 0x24ba75a8, 0xefe6a60d, 0x1d661643, + 0xd63ac5e6, 0x50aeb748, 0x9bf264ed, 0x86f75455, 0x4dab87f0, + 0xcb3ff55e, 0x006326fb, 0xf135942e, 0x3a69478b, 0xbcfd3525, + 0x77a1e680, 0x6aa4d638, 0xa1f8059d, 0x276c7733, 0xec30a496, + 0x191c11ee, 0xd240c24b, 0x54d4b0e5, 0x9f886340, 0x828d53f8, + 0x49d1805d, 0xcf45f2f3, 0x04192156, 0xf54f9383, 0x3e134026, + 0xb8873288, 0x73dbe12d, 0x6eded195, 0xa5820230, 0x2316709e, + 0xe84aa33b, 0x1aca1375, 0xd196c0d0, 0x5702b27e, 0x9c5e61db, + 0x815b5163, 0x4a0782c6, 0xcc93f068, 0x07cf23cd, 0xf6999118, + 0x3dc542bd, 0xbb513013, 0x700de3b6, 0x6d08d30e, 0xa65400ab, + 0x20c07205, 0xeb9ca1a0, 0x11e81eb4, 0xdab4cd11, 0x5c20bfbf, + 0x977c6c1a, 0x8a795ca2, 0x41258f07, 0xc7b1fda9, 0x0ced2e0c, + 0xfdbb9cd9, 0x36e74f7c, 0xb0733dd2, 0x7b2fee77, 0x662adecf, + 0xad760d6a, 0x2be27fc4, 0xe0beac61, 0x123e1c2f, 0xd962cf8a, + 0x5ff6bd24, 0x94aa6e81, 0x89af5e39, 0x42f38d9c, 0xc467ff32, + 0x0f3b2c97, 0xfe6d9e42, 0x35314de7, 0xb3a53f49, 0x78f9ecec, + 0x65fcdc54, 0xaea00ff1, 0x28347d5f, 0xe368aefa, 0x16441b82, + 0xdd18c827, 0x5b8cba89, 0x90d0692c, 0x8dd55994, 0x46898a31, + 0xc01df89f, 0x0b412b3a, 0xfa1799ef, 0x314b4a4a, 0xb7df38e4, + 0x7c83eb41, 0x6186dbf9, 0xaada085c, 0x2c4e7af2, 0xe712a957, + 0x15921919, 0xdececabc, 0x585ab812, 0x93066bb7, 0x8e035b0f, + 0x455f88aa, 0xc3cbfa04, 0x089729a1, 0xf9c19b74, 0x329d48d1, + 0xb4093a7f, 0x7f55e9da, 0x6250d962, 0xa90c0ac7, 0x2f987869, + 0xe4c4abcc}, + {0x00000000, 0x3d6029b0, 0x7ac05360, 0x47a07ad0, 0xf580a6c0, + 0xc8e08f70, 0x8f40f5a0, 0xb220dc10, 0x30704bc1, 0x0d106271, + 0x4ab018a1, 0x77d03111, 0xc5f0ed01, 0xf890c4b1, 0xbf30be61, + 0x825097d1, 0x60e09782, 0x5d80be32, 0x1a20c4e2, 0x2740ed52, + 0x95603142, 0xa80018f2, 0xefa06222, 0xd2c04b92, 0x5090dc43, + 0x6df0f5f3, 0x2a508f23, 0x1730a693, 0xa5107a83, 0x98705333, + 0xdfd029e3, 0xe2b00053, 0xc1c12f04, 0xfca106b4, 0xbb017c64, + 0x866155d4, 0x344189c4, 0x0921a074, 0x4e81daa4, 0x73e1f314, + 0xf1b164c5, 0xccd14d75, 0x8b7137a5, 0xb6111e15, 0x0431c205, + 0x3951ebb5, 0x7ef19165, 0x4391b8d5, 0xa121b886, 0x9c419136, + 0xdbe1ebe6, 0xe681c256, 0x54a11e46, 0x69c137f6, 0x2e614d26, + 0x13016496, 0x9151f347, 0xac31daf7, 0xeb91a027, 0xd6f18997, + 0x64d15587, 0x59b17c37, 0x1e1106e7, 0x23712f57, 0x58f35849, + 0x659371f9, 0x22330b29, 0x1f532299, 0xad73fe89, 0x9013d739, + 0xd7b3ade9, 0xead38459, 0x68831388, 0x55e33a38, 0x124340e8, + 0x2f236958, 0x9d03b548, 0xa0639cf8, 0xe7c3e628, 0xdaa3cf98, + 0x3813cfcb, 0x0573e67b, 0x42d39cab, 0x7fb3b51b, 0xcd93690b, + 0xf0f340bb, 0xb7533a6b, 0x8a3313db, 0x0863840a, 0x3503adba, + 0x72a3d76a, 0x4fc3feda, 0xfde322ca, 0xc0830b7a, 0x872371aa, + 0xba43581a, 0x9932774d, 0xa4525efd, 0xe3f2242d, 0xde920d9d, + 0x6cb2d18d, 0x51d2f83d, 0x167282ed, 0x2b12ab5d, 0xa9423c8c, + 0x9422153c, 0xd3826fec, 0xeee2465c, 0x5cc29a4c, 0x61a2b3fc, + 0x2602c92c, 0x1b62e09c, 0xf9d2e0cf, 0xc4b2c97f, 0x8312b3af, + 0xbe729a1f, 0x0c52460f, 0x31326fbf, 0x7692156f, 0x4bf23cdf, + 0xc9a2ab0e, 0xf4c282be, 0xb362f86e, 0x8e02d1de, 0x3c220dce, + 0x0142247e, 0x46e25eae, 0x7b82771e, 0xb1e6b092, 0x8c869922, + 0xcb26e3f2, 0xf646ca42, 0x44661652, 0x79063fe2, 0x3ea64532, + 0x03c66c82, 0x8196fb53, 0xbcf6d2e3, 0xfb56a833, 0xc6368183, + 0x74165d93, 0x49767423, 0x0ed60ef3, 0x33b62743, 0xd1062710, + 0xec660ea0, 0xabc67470, 0x96a65dc0, 0x248681d0, 0x19e6a860, + 0x5e46d2b0, 0x6326fb00, 0xe1766cd1, 0xdc164561, 0x9bb63fb1, + 0xa6d61601, 0x14f6ca11, 0x2996e3a1, 0x6e369971, 0x5356b0c1, + 0x70279f96, 0x4d47b626, 0x0ae7ccf6, 0x3787e546, 0x85a73956, + 0xb8c710e6, 0xff676a36, 0xc2074386, 0x4057d457, 0x7d37fde7, + 0x3a978737, 0x07f7ae87, 0xb5d77297, 0x88b75b27, 0xcf1721f7, + 0xf2770847, 0x10c70814, 0x2da721a4, 0x6a075b74, 0x576772c4, + 0xe547aed4, 0xd8278764, 0x9f87fdb4, 0xa2e7d404, 0x20b743d5, + 0x1dd76a65, 0x5a7710b5, 0x67173905, 0xd537e515, 0xe857cca5, + 0xaff7b675, 0x92979fc5, 0xe915e8db, 0xd475c16b, 0x93d5bbbb, + 0xaeb5920b, 0x1c954e1b, 0x21f567ab, 0x66551d7b, 0x5b3534cb, + 0xd965a31a, 0xe4058aaa, 0xa3a5f07a, 0x9ec5d9ca, 0x2ce505da, + 0x11852c6a, 0x562556ba, 0x6b457f0a, 0x89f57f59, 0xb49556e9, + 0xf3352c39, 0xce550589, 0x7c75d999, 0x4115f029, 0x06b58af9, + 0x3bd5a349, 0xb9853498, 0x84e51d28, 0xc34567f8, 0xfe254e48, + 0x4c059258, 0x7165bbe8, 0x36c5c138, 0x0ba5e888, 0x28d4c7df, + 0x15b4ee6f, 0x521494bf, 0x6f74bd0f, 0xdd54611f, 0xe03448af, + 0xa794327f, 0x9af41bcf, 0x18a48c1e, 0x25c4a5ae, 0x6264df7e, + 0x5f04f6ce, 0xed242ade, 0xd044036e, 0x97e479be, 0xaa84500e, + 0x4834505d, 0x755479ed, 0x32f4033d, 0x0f942a8d, 0xbdb4f69d, + 0x80d4df2d, 0xc774a5fd, 0xfa148c4d, 0x78441b9c, 0x4524322c, + 0x028448fc, 0x3fe4614c, 0x8dc4bd5c, 0xb0a494ec, 0xf704ee3c, + 0xca64c78c}}; + +local const z_word_t FAR crc_braid_big_table[][256] = { + {0x00000000, 0xb029603d, 0x6053c07a, 0xd07aa047, 0xc0a680f5, + 0x708fe0c8, 0xa0f5408f, 0x10dc20b2, 0xc14b7030, 0x7162100d, + 0xa118b04a, 0x1131d077, 0x01edf0c5, 0xb1c490f8, 0x61be30bf, + 0xd1975082, 0x8297e060, 0x32be805d, 0xe2c4201a, 0x52ed4027, + 0x42316095, 0xf21800a8, 0x2262a0ef, 0x924bc0d2, 0x43dc9050, + 0xf3f5f06d, 0x238f502a, 0x93a63017, 0x837a10a5, 0x33537098, + 0xe329d0df, 0x5300b0e2, 0x042fc1c1, 0xb406a1fc, 0x647c01bb, + 0xd4556186, 0xc4894134, 0x74a02109, 0xa4da814e, 0x14f3e173, + 0xc564b1f1, 0x754dd1cc, 0xa537718b, 0x151e11b6, 0x05c23104, + 0xb5eb5139, 0x6591f17e, 0xd5b89143, 0x86b821a1, 0x3691419c, + 0xe6ebe1db, 0x56c281e6, 0x461ea154, 0xf637c169, 0x264d612e, + 0x96640113, 0x47f35191, 0xf7da31ac, 0x27a091eb, 0x9789f1d6, + 0x8755d164, 0x377cb159, 0xe706111e, 0x572f7123, 0x4958f358, + 0xf9719365, 0x290b3322, 0x9922531f, 0x89fe73ad, 0x39d71390, + 0xe9adb3d7, 0x5984d3ea, 0x88138368, 0x383ae355, 0xe8404312, + 0x5869232f, 0x48b5039d, 0xf89c63a0, 0x28e6c3e7, 0x98cfa3da, + 0xcbcf1338, 0x7be67305, 0xab9cd342, 0x1bb5b37f, 0x0b6993cd, + 0xbb40f3f0, 0x6b3a53b7, 0xdb13338a, 0x0a846308, 0xbaad0335, + 0x6ad7a372, 0xdafec34f, 0xca22e3fd, 0x7a0b83c0, 0xaa712387, + 0x1a5843ba, 0x4d773299, 0xfd5e52a4, 0x2d24f2e3, 0x9d0d92de, + 0x8dd1b26c, 0x3df8d251, 0xed827216, 0x5dab122b, 0x8c3c42a9, + 0x3c152294, 0xec6f82d3, 0x5c46e2ee, 0x4c9ac25c, 0xfcb3a261, + 0x2cc90226, 0x9ce0621b, 0xcfe0d2f9, 0x7fc9b2c4, 0xafb31283, + 0x1f9a72be, 0x0f46520c, 0xbf6f3231, 0x6f159276, 0xdf3cf24b, + 0x0eaba2c9, 0xbe82c2f4, 0x6ef862b3, 0xded1028e, 0xce0d223c, + 0x7e244201, 0xae5ee246, 0x1e77827b, 0x92b0e6b1, 0x2299868c, + 0xf2e326cb, 0x42ca46f6, 0x52166644, 0xe23f0679, 0x3245a63e, + 0x826cc603, 0x53fb9681, 0xe3d2f6bc, 0x33a856fb, 0x838136c6, + 0x935d1674, 0x23747649, 0xf30ed60e, 0x4327b633, 0x102706d1, + 0xa00e66ec, 0x7074c6ab, 0xc05da696, 0xd0818624, 0x60a8e619, + 0xb0d2465e, 0x00fb2663, 0xd16c76e1, 0x614516dc, 0xb13fb69b, + 0x0116d6a6, 0x11caf614, 0xa1e39629, 0x7199366e, 0xc1b05653, + 0x969f2770, 0x26b6474d, 0xf6cce70a, 0x46e58737, 0x5639a785, + 0xe610c7b8, 0x366a67ff, 0x864307c2, 0x57d45740, 0xe7fd377d, + 0x3787973a, 0x87aef707, 0x9772d7b5, 0x275bb788, 0xf72117cf, + 0x470877f2, 0x1408c710, 0xa421a72d, 0x745b076a, 0xc4726757, + 0xd4ae47e5, 0x648727d8, 0xb4fd879f, 0x04d4e7a2, 0xd543b720, + 0x656ad71d, 0xb510775a, 0x05391767, 0x15e537d5, 0xa5cc57e8, + 0x75b6f7af, 0xc59f9792, 0xdbe815e9, 0x6bc175d4, 0xbbbbd593, + 0x0b92b5ae, 0x1b4e951c, 0xab67f521, 0x7b1d5566, 0xcb34355b, + 0x1aa365d9, 0xaa8a05e4, 0x7af0a5a3, 0xcad9c59e, 0xda05e52c, + 0x6a2c8511, 0xba562556, 0x0a7f456b, 0x597ff589, 0xe95695b4, + 0x392c35f3, 0x890555ce, 0x99d9757c, 0x29f01541, 0xf98ab506, + 0x49a3d53b, 0x983485b9, 0x281de584, 0xf86745c3, 0x484e25fe, + 0x5892054c, 0xe8bb6571, 0x38c1c536, 0x88e8a50b, 0xdfc7d428, + 0x6feeb415, 0xbf941452, 0x0fbd746f, 0x1f6154dd, 0xaf4834e0, + 0x7f3294a7, 0xcf1bf49a, 0x1e8ca418, 0xaea5c425, 0x7edf6462, + 0xcef6045f, 0xde2a24ed, 0x6e0344d0, 0xbe79e497, 0x0e5084aa, + 0x5d503448, 0xed795475, 0x3d03f432, 0x8d2a940f, 0x9df6b4bd, + 0x2ddfd480, 0xfda574c7, 0x4d8c14fa, 0x9c1b4478, 0x2c322445, + 0xfc488402, 0x4c61e43f, 0x5cbdc48d, 0xec94a4b0, 0x3cee04f7, + 0x8cc764ca}, + {0x00000000, 0xa5d35ccb, 0x0ba1c84d, 0xae729486, 0x1642919b, + 0xb391cd50, 0x1de359d6, 0xb830051d, 0x6d8253ec, 0xc8510f27, + 0x66239ba1, 0xc3f0c76a, 0x7bc0c277, 0xde139ebc, 0x70610a3a, + 0xd5b256f1, 0x9b02d603, 0x3ed18ac8, 0x90a31e4e, 0x35704285, + 0x8d404798, 0x28931b53, 0x86e18fd5, 0x2332d31e, 0xf68085ef, + 0x5353d924, 0xfd214da2, 0x58f21169, 0xe0c21474, 0x451148bf, + 0xeb63dc39, 0x4eb080f2, 0x3605ac07, 0x93d6f0cc, 0x3da4644a, + 0x98773881, 0x20473d9c, 0x85946157, 0x2be6f5d1, 0x8e35a91a, + 0x5b87ffeb, 0xfe54a320, 0x502637a6, 0xf5f56b6d, 0x4dc56e70, + 0xe81632bb, 0x4664a63d, 0xe3b7faf6, 0xad077a04, 0x08d426cf, + 0xa6a6b249, 0x0375ee82, 0xbb45eb9f, 0x1e96b754, 0xb0e423d2, + 0x15377f19, 0xc08529e8, 0x65567523, 0xcb24e1a5, 0x6ef7bd6e, + 0xd6c7b873, 0x7314e4b8, 0xdd66703e, 0x78b52cf5, 0x6c0a580f, + 0xc9d904c4, 0x67ab9042, 0xc278cc89, 0x7a48c994, 0xdf9b955f, + 0x71e901d9, 0xd43a5d12, 0x01880be3, 0xa45b5728, 0x0a29c3ae, + 0xaffa9f65, 0x17ca9a78, 0xb219c6b3, 0x1c6b5235, 0xb9b80efe, + 0xf7088e0c, 0x52dbd2c7, 0xfca94641, 0x597a1a8a, 0xe14a1f97, + 0x4499435c, 0xeaebd7da, 0x4f388b11, 0x9a8adde0, 0x3f59812b, + 0x912b15ad, 0x34f84966, 0x8cc84c7b, 0x291b10b0, 0x87698436, + 0x22bad8fd, 0x5a0ff408, 0xffdca8c3, 0x51ae3c45, 0xf47d608e, + 0x4c4d6593, 0xe99e3958, 0x47ecadde, 0xe23ff115, 0x378da7e4, + 0x925efb2f, 0x3c2c6fa9, 0x99ff3362, 0x21cf367f, 0x841c6ab4, + 0x2a6efe32, 0x8fbda2f9, 0xc10d220b, 0x64de7ec0, 0xcaacea46, + 0x6f7fb68d, 0xd74fb390, 0x729cef5b, 0xdcee7bdd, 0x793d2716, + 0xac8f71e7, 0x095c2d2c, 0xa72eb9aa, 0x02fde561, 0xbacde07c, + 0x1f1ebcb7, 0xb16c2831, 0x14bf74fa, 0xd814b01e, 0x7dc7ecd5, + 0xd3b57853, 0x76662498, 0xce562185, 0x6b857d4e, 0xc5f7e9c8, + 0x6024b503, 0xb596e3f2, 0x1045bf39, 0xbe372bbf, 0x1be47774, + 0xa3d47269, 0x06072ea2, 0xa875ba24, 0x0da6e6ef, 0x4316661d, + 0xe6c53ad6, 0x48b7ae50, 0xed64f29b, 0x5554f786, 0xf087ab4d, + 0x5ef53fcb, 0xfb266300, 0x2e9435f1, 0x8b47693a, 0x2535fdbc, + 0x80e6a177, 0x38d6a46a, 0x9d05f8a1, 0x33776c27, 0x96a430ec, + 0xee111c19, 0x4bc240d2, 0xe5b0d454, 0x4063889f, 0xf8538d82, + 0x5d80d149, 0xf3f245cf, 0x56211904, 0x83934ff5, 0x2640133e, + 0x883287b8, 0x2de1db73, 0x95d1de6e, 0x300282a5, 0x9e701623, + 0x3ba34ae8, 0x7513ca1a, 0xd0c096d1, 0x7eb20257, 0xdb615e9c, + 0x63515b81, 0xc682074a, 0x68f093cc, 0xcd23cf07, 0x189199f6, + 0xbd42c53d, 0x133051bb, 0xb6e30d70, 0x0ed3086d, 0xab0054a6, + 0x0572c020, 0xa0a19ceb, 0xb41ee811, 0x11cdb4da, 0xbfbf205c, + 0x1a6c7c97, 0xa25c798a, 0x078f2541, 0xa9fdb1c7, 0x0c2eed0c, + 0xd99cbbfd, 0x7c4fe736, 0xd23d73b0, 0x77ee2f7b, 0xcfde2a66, + 0x6a0d76ad, 0xc47fe22b, 0x61acbee0, 0x2f1c3e12, 0x8acf62d9, + 0x24bdf65f, 0x816eaa94, 0x395eaf89, 0x9c8df342, 0x32ff67c4, + 0x972c3b0f, 0x429e6dfe, 0xe74d3135, 0x493fa5b3, 0xececf978, + 0x54dcfc65, 0xf10fa0ae, 0x5f7d3428, 0xfaae68e3, 0x821b4416, + 0x27c818dd, 0x89ba8c5b, 0x2c69d090, 0x9459d58d, 0x318a8946, + 0x9ff81dc0, 0x3a2b410b, 0xef9917fa, 0x4a4a4b31, 0xe438dfb7, + 0x41eb837c, 0xf9db8661, 0x5c08daaa, 0xf27a4e2c, 0x57a912e7, + 0x19199215, 0xbccacede, 0x12b85a58, 0xb76b0693, 0x0f5b038e, + 0xaa885f45, 0x04facbc3, 0xa1299708, 0x749bc1f9, 0xd1489d32, + 0x7f3a09b4, 0xdae9557f, 0x62d95062, 0xc70a0ca9, 0x6978982f, + 0xccabc4e4}, + {0x00000000, 0xb40b77a6, 0x29119f97, 0x9d1ae831, 0x13244ff4, + 0xa72f3852, 0x3a35d063, 0x8e3ea7c5, 0x674eef33, 0xd3459895, + 0x4e5f70a4, 0xfa540702, 0x746aa0c7, 0xc061d761, 0x5d7b3f50, + 0xe97048f6, 0xce9cde67, 0x7a97a9c1, 0xe78d41f0, 0x53863656, + 0xddb89193, 0x69b3e635, 0xf4a90e04, 0x40a279a2, 0xa9d23154, + 0x1dd946f2, 0x80c3aec3, 0x34c8d965, 0xbaf67ea0, 0x0efd0906, + 0x93e7e137, 0x27ec9691, 0x9c39bdcf, 0x2832ca69, 0xb5282258, + 0x012355fe, 0x8f1df23b, 0x3b16859d, 0xa60c6dac, 0x12071a0a, + 0xfb7752fc, 0x4f7c255a, 0xd266cd6b, 0x666dbacd, 0xe8531d08, + 0x5c586aae, 0xc142829f, 0x7549f539, 0x52a563a8, 0xe6ae140e, + 0x7bb4fc3f, 0xcfbf8b99, 0x41812c5c, 0xf58a5bfa, 0x6890b3cb, + 0xdc9bc46d, 0x35eb8c9b, 0x81e0fb3d, 0x1cfa130c, 0xa8f164aa, + 0x26cfc36f, 0x92c4b4c9, 0x0fde5cf8, 0xbbd52b5e, 0x79750b44, + 0xcd7e7ce2, 0x506494d3, 0xe46fe375, 0x6a5144b0, 0xde5a3316, + 0x4340db27, 0xf74bac81, 0x1e3be477, 0xaa3093d1, 0x372a7be0, + 0x83210c46, 0x0d1fab83, 0xb914dc25, 0x240e3414, 0x900543b2, + 0xb7e9d523, 0x03e2a285, 0x9ef84ab4, 0x2af33d12, 0xa4cd9ad7, + 0x10c6ed71, 0x8ddc0540, 0x39d772e6, 0xd0a73a10, 0x64ac4db6, + 0xf9b6a587, 0x4dbdd221, 0xc38375e4, 0x77880242, 0xea92ea73, + 0x5e999dd5, 0xe54cb68b, 0x5147c12d, 0xcc5d291c, 0x78565eba, + 0xf668f97f, 0x42638ed9, 0xdf7966e8, 0x6b72114e, 0x820259b8, + 0x36092e1e, 0xab13c62f, 0x1f18b189, 0x9126164c, 0x252d61ea, + 0xb83789db, 0x0c3cfe7d, 0x2bd068ec, 0x9fdb1f4a, 0x02c1f77b, + 0xb6ca80dd, 0x38f42718, 0x8cff50be, 0x11e5b88f, 0xa5eecf29, + 0x4c9e87df, 0xf895f079, 0x658f1848, 0xd1846fee, 0x5fbac82b, + 0xebb1bf8d, 0x76ab57bc, 0xc2a0201a, 0xf2ea1688, 0x46e1612e, + 0xdbfb891f, 0x6ff0feb9, 0xe1ce597c, 0x55c52eda, 0xc8dfc6eb, + 0x7cd4b14d, 0x95a4f9bb, 0x21af8e1d, 0xbcb5662c, 0x08be118a, + 0x8680b64f, 0x328bc1e9, 0xaf9129d8, 0x1b9a5e7e, 0x3c76c8ef, + 0x887dbf49, 0x15675778, 0xa16c20de, 0x2f52871b, 0x9b59f0bd, + 0x0643188c, 0xb2486f2a, 0x5b3827dc, 0xef33507a, 0x7229b84b, + 0xc622cfed, 0x481c6828, 0xfc171f8e, 0x610df7bf, 0xd5068019, + 0x6ed3ab47, 0xdad8dce1, 0x47c234d0, 0xf3c94376, 0x7df7e4b3, + 0xc9fc9315, 0x54e67b24, 0xe0ed0c82, 0x099d4474, 0xbd9633d2, + 0x208cdbe3, 0x9487ac45, 0x1ab90b80, 0xaeb27c26, 0x33a89417, + 0x87a3e3b1, 0xa04f7520, 0x14440286, 0x895eeab7, 0x3d559d11, + 0xb36b3ad4, 0x07604d72, 0x9a7aa543, 0x2e71d2e5, 0xc7019a13, + 0x730aedb5, 0xee100584, 0x5a1b7222, 0xd425d5e7, 0x602ea241, + 0xfd344a70, 0x493f3dd6, 0x8b9f1dcc, 0x3f946a6a, 0xa28e825b, + 0x1685f5fd, 0x98bb5238, 0x2cb0259e, 0xb1aacdaf, 0x05a1ba09, + 0xecd1f2ff, 0x58da8559, 0xc5c06d68, 0x71cb1ace, 0xfff5bd0b, + 0x4bfecaad, 0xd6e4229c, 0x62ef553a, 0x4503c3ab, 0xf108b40d, + 0x6c125c3c, 0xd8192b9a, 0x56278c5f, 0xe22cfbf9, 0x7f3613c8, + 0xcb3d646e, 0x224d2c98, 0x96465b3e, 0x0b5cb30f, 0xbf57c4a9, + 0x3169636c, 0x856214ca, 0x1878fcfb, 0xac738b5d, 0x17a6a003, + 0xa3add7a5, 0x3eb73f94, 0x8abc4832, 0x0482eff7, 0xb0899851, + 0x2d937060, 0x999807c6, 0x70e84f30, 0xc4e33896, 0x59f9d0a7, + 0xedf2a701, 0x63cc00c4, 0xd7c77762, 0x4add9f53, 0xfed6e8f5, + 0xd93a7e64, 0x6d3109c2, 0xf02be1f3, 0x44209655, 0xca1e3190, + 0x7e154636, 0xe30fae07, 0x5704d9a1, 0xbe749157, 0x0a7fe6f1, + 0x97650ec0, 0x236e7966, 0xad50dea3, 0x195ba905, 0x84414134, + 0x304a3692}, + {0x00000000, 0x9e00aacc, 0x7d072542, 0xe3078f8e, 0xfa0e4a84, + 0x640ee048, 0x87096fc6, 0x1909c50a, 0xb51be5d3, 0x2b1b4f1f, + 0xc81cc091, 0x561c6a5d, 0x4f15af57, 0xd115059b, 0x32128a15, + 0xac1220d9, 0x2b31bb7c, 0xb53111b0, 0x56369e3e, 0xc83634f2, + 0xd13ff1f8, 0x4f3f5b34, 0xac38d4ba, 0x32387e76, 0x9e2a5eaf, + 0x002af463, 0xe32d7bed, 0x7d2dd121, 0x6424142b, 0xfa24bee7, + 0x19233169, 0x87239ba5, 0x566276f9, 0xc862dc35, 0x2b6553bb, + 0xb565f977, 0xac6c3c7d, 0x326c96b1, 0xd16b193f, 0x4f6bb3f3, + 0xe379932a, 0x7d7939e6, 0x9e7eb668, 0x007e1ca4, 0x1977d9ae, + 0x87777362, 0x6470fcec, 0xfa705620, 0x7d53cd85, 0xe3536749, + 0x0054e8c7, 0x9e54420b, 0x875d8701, 0x195d2dcd, 0xfa5aa243, + 0x645a088f, 0xc8482856, 0x5648829a, 0xb54f0d14, 0x2b4fa7d8, + 0x324662d2, 0xac46c81e, 0x4f414790, 0xd141ed5c, 0xedc29d29, + 0x73c237e5, 0x90c5b86b, 0x0ec512a7, 0x17ccd7ad, 0x89cc7d61, + 0x6acbf2ef, 0xf4cb5823, 0x58d978fa, 0xc6d9d236, 0x25de5db8, + 0xbbdef774, 0xa2d7327e, 0x3cd798b2, 0xdfd0173c, 0x41d0bdf0, + 0xc6f32655, 0x58f38c99, 0xbbf40317, 0x25f4a9db, 0x3cfd6cd1, + 0xa2fdc61d, 0x41fa4993, 0xdffae35f, 0x73e8c386, 0xede8694a, + 0x0eefe6c4, 0x90ef4c08, 0x89e68902, 0x17e623ce, 0xf4e1ac40, + 0x6ae1068c, 0xbba0ebd0, 0x25a0411c, 0xc6a7ce92, 0x58a7645e, + 0x41aea154, 0xdfae0b98, 0x3ca98416, 0xa2a92eda, 0x0ebb0e03, + 0x90bba4cf, 0x73bc2b41, 0xedbc818d, 0xf4b54487, 0x6ab5ee4b, + 0x89b261c5, 0x17b2cb09, 0x909150ac, 0x0e91fa60, 0xed9675ee, + 0x7396df22, 0x6a9f1a28, 0xf49fb0e4, 0x17983f6a, 0x899895a6, + 0x258ab57f, 0xbb8a1fb3, 0x588d903d, 0xc68d3af1, 0xdf84fffb, + 0x41845537, 0xa283dab9, 0x3c837075, 0xda853b53, 0x4485919f, + 0xa7821e11, 0x3982b4dd, 0x208b71d7, 0xbe8bdb1b, 0x5d8c5495, + 0xc38cfe59, 0x6f9ede80, 0xf19e744c, 0x1299fbc2, 0x8c99510e, + 0x95909404, 0x0b903ec8, 0xe897b146, 0x76971b8a, 0xf1b4802f, + 0x6fb42ae3, 0x8cb3a56d, 0x12b30fa1, 0x0bbacaab, 0x95ba6067, + 0x76bdefe9, 0xe8bd4525, 0x44af65fc, 0xdaafcf30, 0x39a840be, + 0xa7a8ea72, 0xbea12f78, 0x20a185b4, 0xc3a60a3a, 0x5da6a0f6, + 0x8ce74daa, 0x12e7e766, 0xf1e068e8, 0x6fe0c224, 0x76e9072e, + 0xe8e9ade2, 0x0bee226c, 0x95ee88a0, 0x39fca879, 0xa7fc02b5, + 0x44fb8d3b, 0xdafb27f7, 0xc3f2e2fd, 0x5df24831, 0xbef5c7bf, + 0x20f56d73, 0xa7d6f6d6, 0x39d65c1a, 0xdad1d394, 0x44d17958, + 0x5dd8bc52, 0xc3d8169e, 0x20df9910, 0xbedf33dc, 0x12cd1305, + 0x8ccdb9c9, 0x6fca3647, 0xf1ca9c8b, 0xe8c35981, 0x76c3f34d, + 0x95c47cc3, 0x0bc4d60f, 0x3747a67a, 0xa9470cb6, 0x4a408338, + 0xd44029f4, 0xcd49ecfe, 0x53494632, 0xb04ec9bc, 0x2e4e6370, + 0x825c43a9, 0x1c5ce965, 0xff5b66eb, 0x615bcc27, 0x7852092d, + 0xe652a3e1, 0x05552c6f, 0x9b5586a3, 0x1c761d06, 0x8276b7ca, + 0x61713844, 0xff719288, 0xe6785782, 0x7878fd4e, 0x9b7f72c0, + 0x057fd80c, 0xa96df8d5, 0x376d5219, 0xd46add97, 0x4a6a775b, + 0x5363b251, 0xcd63189d, 0x2e649713, 0xb0643ddf, 0x6125d083, + 0xff257a4f, 0x1c22f5c1, 0x82225f0d, 0x9b2b9a07, 0x052b30cb, + 0xe62cbf45, 0x782c1589, 0xd43e3550, 0x4a3e9f9c, 0xa9391012, + 0x3739bade, 0x2e307fd4, 0xb030d518, 0x53375a96, 0xcd37f05a, + 0x4a146bff, 0xd414c133, 0x37134ebd, 0xa913e471, 0xb01a217b, + 0x2e1a8bb7, 0xcd1d0439, 0x531daef5, 0xff0f8e2c, 0x610f24e0, + 0x8208ab6e, 0x1c0801a2, 0x0501c4a8, 0x9b016e64, 0x7806e1ea, + 0xe6064b26}}; + #endif - } -}; + +#endif + +#if N == 3 + +#if W == 8 + +local const z_crc_t FAR crc_braid_table[][256] = { + {0x00000000, 0x81256527, 0xd93bcc0f, 0x581ea928, 0x69069e5f, + 0xe823fb78, 0xb03d5250, 0x31183777, 0xd20d3cbe, 0x53285999, + 0x0b36f0b1, 0x8a139596, 0xbb0ba2e1, 0x3a2ec7c6, 0x62306eee, + 0xe3150bc9, 0x7f6b7f3d, 0xfe4e1a1a, 0xa650b332, 0x2775d615, + 0x166de162, 0x97488445, 0xcf562d6d, 0x4e73484a, 0xad664383, + 0x2c4326a4, 0x745d8f8c, 0xf578eaab, 0xc460dddc, 0x4545b8fb, + 0x1d5b11d3, 0x9c7e74f4, 0xfed6fe7a, 0x7ff39b5d, 0x27ed3275, + 0xa6c85752, 0x97d06025, 0x16f50502, 0x4eebac2a, 0xcfcec90d, + 0x2cdbc2c4, 0xadfea7e3, 0xf5e00ecb, 0x74c56bec, 0x45dd5c9b, + 0xc4f839bc, 0x9ce69094, 0x1dc3f5b3, 0x81bd8147, 0x0098e460, + 0x58864d48, 0xd9a3286f, 0xe8bb1f18, 0x699e7a3f, 0x3180d317, + 0xb0a5b630, 0x53b0bdf9, 0xd295d8de, 0x8a8b71f6, 0x0bae14d1, + 0x3ab623a6, 0xbb934681, 0xe38defa9, 0x62a88a8e, 0x26dcfab5, + 0xa7f99f92, 0xffe736ba, 0x7ec2539d, 0x4fda64ea, 0xceff01cd, + 0x96e1a8e5, 0x17c4cdc2, 0xf4d1c60b, 0x75f4a32c, 0x2dea0a04, + 0xaccf6f23, 0x9dd75854, 0x1cf23d73, 0x44ec945b, 0xc5c9f17c, + 0x59b78588, 0xd892e0af, 0x808c4987, 0x01a92ca0, 0x30b11bd7, + 0xb1947ef0, 0xe98ad7d8, 0x68afb2ff, 0x8bbab936, 0x0a9fdc11, + 0x52817539, 0xd3a4101e, 0xe2bc2769, 0x6399424e, 0x3b87eb66, + 0xbaa28e41, 0xd80a04cf, 0x592f61e8, 0x0131c8c0, 0x8014ade7, + 0xb10c9a90, 0x3029ffb7, 0x6837569f, 0xe91233b8, 0x0a073871, + 0x8b225d56, 0xd33cf47e, 0x52199159, 0x6301a62e, 0xe224c309, + 0xba3a6a21, 0x3b1f0f06, 0xa7617bf2, 0x26441ed5, 0x7e5ab7fd, + 0xff7fd2da, 0xce67e5ad, 0x4f42808a, 0x175c29a2, 0x96794c85, + 0x756c474c, 0xf449226b, 0xac578b43, 0x2d72ee64, 0x1c6ad913, + 0x9d4fbc34, 0xc551151c, 0x4474703b, 0x4db9f56a, 0xcc9c904d, + 0x94823965, 0x15a75c42, 0x24bf6b35, 0xa59a0e12, 0xfd84a73a, + 0x7ca1c21d, 0x9fb4c9d4, 0x1e91acf3, 0x468f05db, 0xc7aa60fc, + 0xf6b2578b, 0x779732ac, 0x2f899b84, 0xaeacfea3, 0x32d28a57, + 0xb3f7ef70, 0xebe94658, 0x6acc237f, 0x5bd41408, 0xdaf1712f, + 0x82efd807, 0x03cabd20, 0xe0dfb6e9, 0x61fad3ce, 0x39e47ae6, + 0xb8c11fc1, 0x89d928b6, 0x08fc4d91, 0x50e2e4b9, 0xd1c7819e, + 0xb36f0b10, 0x324a6e37, 0x6a54c71f, 0xeb71a238, 0xda69954f, + 0x5b4cf068, 0x03525940, 0x82773c67, 0x616237ae, 0xe0475289, + 0xb859fba1, 0x397c9e86, 0x0864a9f1, 0x8941ccd6, 0xd15f65fe, + 0x507a00d9, 0xcc04742d, 0x4d21110a, 0x153fb822, 0x941add05, + 0xa502ea72, 0x24278f55, 0x7c39267d, 0xfd1c435a, 0x1e094893, + 0x9f2c2db4, 0xc732849c, 0x4617e1bb, 0x770fd6cc, 0xf62ab3eb, + 0xae341ac3, 0x2f117fe4, 0x6b650fdf, 0xea406af8, 0xb25ec3d0, + 0x337ba6f7, 0x02639180, 0x8346f4a7, 0xdb585d8f, 0x5a7d38a8, + 0xb9683361, 0x384d5646, 0x6053ff6e, 0xe1769a49, 0xd06ead3e, + 0x514bc819, 0x09556131, 0x88700416, 0x140e70e2, 0x952b15c5, + 0xcd35bced, 0x4c10d9ca, 0x7d08eebd, 0xfc2d8b9a, 0xa43322b2, + 0x25164795, 0xc6034c5c, 0x4726297b, 0x1f388053, 0x9e1de574, + 0xaf05d203, 0x2e20b724, 0x763e1e0c, 0xf71b7b2b, 0x95b3f1a5, + 0x14969482, 0x4c883daa, 0xcdad588d, 0xfcb56ffa, 0x7d900add, + 0x258ea3f5, 0xa4abc6d2, 0x47becd1b, 0xc69ba83c, 0x9e850114, + 0x1fa06433, 0x2eb85344, 0xaf9d3663, 0xf7839f4b, 0x76a6fa6c, + 0xead88e98, 0x6bfdebbf, 0x33e34297, 0xb2c627b0, 0x83de10c7, + 0x02fb75e0, 0x5ae5dcc8, 0xdbc0b9ef, 0x38d5b226, 0xb9f0d701, + 0xe1ee7e29, 0x60cb1b0e, 0x51d32c79, 0xd0f6495e, 0x88e8e076, + 0x09cd8551}, + {0x00000000, 0x9b73ead4, 0xed96d3e9, 0x76e5393d, 0x005ca193, + 0x9b2f4b47, 0xedca727a, 0x76b998ae, 0x00b94326, 0x9bcaa9f2, + 0xed2f90cf, 0x765c7a1b, 0x00e5e2b5, 0x9b960861, 0xed73315c, + 0x7600db88, 0x0172864c, 0x9a016c98, 0xece455a5, 0x7797bf71, + 0x012e27df, 0x9a5dcd0b, 0xecb8f436, 0x77cb1ee2, 0x01cbc56a, + 0x9ab82fbe, 0xec5d1683, 0x772efc57, 0x019764f9, 0x9ae48e2d, + 0xec01b710, 0x77725dc4, 0x02e50c98, 0x9996e64c, 0xef73df71, + 0x740035a5, 0x02b9ad0b, 0x99ca47df, 0xef2f7ee2, 0x745c9436, + 0x025c4fbe, 0x992fa56a, 0xefca9c57, 0x74b97683, 0x0200ee2d, + 0x997304f9, 0xef963dc4, 0x74e5d710, 0x03978ad4, 0x98e46000, + 0xee01593d, 0x7572b3e9, 0x03cb2b47, 0x98b8c193, 0xee5df8ae, + 0x752e127a, 0x032ec9f2, 0x985d2326, 0xeeb81a1b, 0x75cbf0cf, + 0x03726861, 0x980182b5, 0xeee4bb88, 0x7597515c, 0x05ca1930, + 0x9eb9f3e4, 0xe85ccad9, 0x732f200d, 0x0596b8a3, 0x9ee55277, + 0xe8006b4a, 0x7373819e, 0x05735a16, 0x9e00b0c2, 0xe8e589ff, + 0x7396632b, 0x052ffb85, 0x9e5c1151, 0xe8b9286c, 0x73cac2b8, + 0x04b89f7c, 0x9fcb75a8, 0xe92e4c95, 0x725da641, 0x04e43eef, + 0x9f97d43b, 0xe972ed06, 0x720107d2, 0x0401dc5a, 0x9f72368e, + 0xe9970fb3, 0x72e4e567, 0x045d7dc9, 0x9f2e971d, 0xe9cbae20, + 0x72b844f4, 0x072f15a8, 0x9c5cff7c, 0xeab9c641, 0x71ca2c95, + 0x0773b43b, 0x9c005eef, 0xeae567d2, 0x71968d06, 0x0796568e, + 0x9ce5bc5a, 0xea008567, 0x71736fb3, 0x07caf71d, 0x9cb91dc9, + 0xea5c24f4, 0x712fce20, 0x065d93e4, 0x9d2e7930, 0xebcb400d, + 0x70b8aad9, 0x06013277, 0x9d72d8a3, 0xeb97e19e, 0x70e40b4a, + 0x06e4d0c2, 0x9d973a16, 0xeb72032b, 0x7001e9ff, 0x06b87151, + 0x9dcb9b85, 0xeb2ea2b8, 0x705d486c, 0x0b943260, 0x90e7d8b4, + 0xe602e189, 0x7d710b5d, 0x0bc893f3, 0x90bb7927, 0xe65e401a, + 0x7d2daace, 0x0b2d7146, 0x905e9b92, 0xe6bba2af, 0x7dc8487b, + 0x0b71d0d5, 0x90023a01, 0xe6e7033c, 0x7d94e9e8, 0x0ae6b42c, + 0x91955ef8, 0xe77067c5, 0x7c038d11, 0x0aba15bf, 0x91c9ff6b, + 0xe72cc656, 0x7c5f2c82, 0x0a5ff70a, 0x912c1dde, 0xe7c924e3, + 0x7cbace37, 0x0a035699, 0x9170bc4d, 0xe7958570, 0x7ce66fa4, + 0x09713ef8, 0x9202d42c, 0xe4e7ed11, 0x7f9407c5, 0x092d9f6b, + 0x925e75bf, 0xe4bb4c82, 0x7fc8a656, 0x09c87dde, 0x92bb970a, + 0xe45eae37, 0x7f2d44e3, 0x0994dc4d, 0x92e73699, 0xe4020fa4, + 0x7f71e570, 0x0803b8b4, 0x93705260, 0xe5956b5d, 0x7ee68189, + 0x085f1927, 0x932cf3f3, 0xe5c9cace, 0x7eba201a, 0x08bafb92, + 0x93c91146, 0xe52c287b, 0x7e5fc2af, 0x08e65a01, 0x9395b0d5, + 0xe57089e8, 0x7e03633c, 0x0e5e2b50, 0x952dc184, 0xe3c8f8b9, + 0x78bb126d, 0x0e028ac3, 0x95716017, 0xe394592a, 0x78e7b3fe, + 0x0ee76876, 0x959482a2, 0xe371bb9f, 0x7802514b, 0x0ebbc9e5, + 0x95c82331, 0xe32d1a0c, 0x785ef0d8, 0x0f2cad1c, 0x945f47c8, + 0xe2ba7ef5, 0x79c99421, 0x0f700c8f, 0x9403e65b, 0xe2e6df66, + 0x799535b2, 0x0f95ee3a, 0x94e604ee, 0xe2033dd3, 0x7970d707, + 0x0fc94fa9, 0x94baa57d, 0xe25f9c40, 0x792c7694, 0x0cbb27c8, + 0x97c8cd1c, 0xe12df421, 0x7a5e1ef5, 0x0ce7865b, 0x97946c8f, + 0xe17155b2, 0x7a02bf66, 0x0c0264ee, 0x97718e3a, 0xe194b707, + 0x7ae75dd3, 0x0c5ec57d, 0x972d2fa9, 0xe1c81694, 0x7abbfc40, + 0x0dc9a184, 0x96ba4b50, 0xe05f726d, 0x7b2c98b9, 0x0d950017, + 0x96e6eac3, 0xe003d3fe, 0x7b70392a, 0x0d70e2a2, 0x96030876, + 0xe0e6314b, 0x7b95db9f, 0x0d2c4331, 0x965fa9e5, 0xe0ba90d8, + 0x7bc97a0c}, + {0x00000000, 0x172864c0, 0x2e50c980, 0x3978ad40, 0x5ca19300, + 0x4b89f7c0, 0x72f15a80, 0x65d93e40, 0xb9432600, 0xae6b42c0, + 0x9713ef80, 0x803b8b40, 0xe5e2b500, 0xf2cad1c0, 0xcbb27c80, + 0xdc9a1840, 0xa9f74a41, 0xbedf2e81, 0x87a783c1, 0x908fe701, + 0xf556d941, 0xe27ebd81, 0xdb0610c1, 0xcc2e7401, 0x10b46c41, + 0x079c0881, 0x3ee4a5c1, 0x29ccc101, 0x4c15ff41, 0x5b3d9b81, + 0x624536c1, 0x756d5201, 0x889f92c3, 0x9fb7f603, 0xa6cf5b43, + 0xb1e73f83, 0xd43e01c3, 0xc3166503, 0xfa6ec843, 0xed46ac83, + 0x31dcb4c3, 0x26f4d003, 0x1f8c7d43, 0x08a41983, 0x6d7d27c3, + 0x7a554303, 0x432dee43, 0x54058a83, 0x2168d882, 0x3640bc42, + 0x0f381102, 0x181075c2, 0x7dc94b82, 0x6ae12f42, 0x53998202, + 0x44b1e6c2, 0x982bfe82, 0x8f039a42, 0xb67b3702, 0xa15353c2, + 0xc48a6d82, 0xd3a20942, 0xeadaa402, 0xfdf2c0c2, 0xca4e23c7, + 0xdd664707, 0xe41eea47, 0xf3368e87, 0x96efb0c7, 0x81c7d407, + 0xb8bf7947, 0xaf971d87, 0x730d05c7, 0x64256107, 0x5d5dcc47, + 0x4a75a887, 0x2fac96c7, 0x3884f207, 0x01fc5f47, 0x16d43b87, + 0x63b96986, 0x74910d46, 0x4de9a006, 0x5ac1c4c6, 0x3f18fa86, + 0x28309e46, 0x11483306, 0x066057c6, 0xdafa4f86, 0xcdd22b46, + 0xf4aa8606, 0xe382e2c6, 0x865bdc86, 0x9173b846, 0xa80b1506, + 0xbf2371c6, 0x42d1b104, 0x55f9d5c4, 0x6c817884, 0x7ba91c44, + 0x1e702204, 0x095846c4, 0x3020eb84, 0x27088f44, 0xfb929704, + 0xecbaf3c4, 0xd5c25e84, 0xc2ea3a44, 0xa7330404, 0xb01b60c4, + 0x8963cd84, 0x9e4ba944, 0xeb26fb45, 0xfc0e9f85, 0xc57632c5, + 0xd25e5605, 0xb7876845, 0xa0af0c85, 0x99d7a1c5, 0x8effc505, + 0x5265dd45, 0x454db985, 0x7c3514c5, 0x6b1d7005, 0x0ec44e45, + 0x19ec2a85, 0x209487c5, 0x37bce305, 0x4fed41cf, 0x58c5250f, + 0x61bd884f, 0x7695ec8f, 0x134cd2cf, 0x0464b60f, 0x3d1c1b4f, + 0x2a347f8f, 0xf6ae67cf, 0xe186030f, 0xd8feae4f, 0xcfd6ca8f, + 0xaa0ff4cf, 0xbd27900f, 0x845f3d4f, 0x9377598f, 0xe61a0b8e, + 0xf1326f4e, 0xc84ac20e, 0xdf62a6ce, 0xbabb988e, 0xad93fc4e, + 0x94eb510e, 0x83c335ce, 0x5f592d8e, 0x4871494e, 0x7109e40e, + 0x662180ce, 0x03f8be8e, 0x14d0da4e, 0x2da8770e, 0x3a8013ce, + 0xc772d30c, 0xd05ab7cc, 0xe9221a8c, 0xfe0a7e4c, 0x9bd3400c, + 0x8cfb24cc, 0xb583898c, 0xa2abed4c, 0x7e31f50c, 0x691991cc, + 0x50613c8c, 0x4749584c, 0x2290660c, 0x35b802cc, 0x0cc0af8c, + 0x1be8cb4c, 0x6e85994d, 0x79adfd8d, 0x40d550cd, 0x57fd340d, + 0x32240a4d, 0x250c6e8d, 0x1c74c3cd, 0x0b5ca70d, 0xd7c6bf4d, + 0xc0eedb8d, 0xf99676cd, 0xeebe120d, 0x8b672c4d, 0x9c4f488d, + 0xa537e5cd, 0xb21f810d, 0x85a36208, 0x928b06c8, 0xabf3ab88, + 0xbcdbcf48, 0xd902f108, 0xce2a95c8, 0xf7523888, 0xe07a5c48, + 0x3ce04408, 0x2bc820c8, 0x12b08d88, 0x0598e948, 0x6041d708, + 0x7769b3c8, 0x4e111e88, 0x59397a48, 0x2c542849, 0x3b7c4c89, + 0x0204e1c9, 0x152c8509, 0x70f5bb49, 0x67dddf89, 0x5ea572c9, + 0x498d1609, 0x95170e49, 0x823f6a89, 0xbb47c7c9, 0xac6fa309, + 0xc9b69d49, 0xde9ef989, 0xe7e654c9, 0xf0ce3009, 0x0d3cf0cb, + 0x1a14940b, 0x236c394b, 0x34445d8b, 0x519d63cb, 0x46b5070b, + 0x7fcdaa4b, 0x68e5ce8b, 0xb47fd6cb, 0xa357b20b, 0x9a2f1f4b, + 0x8d077b8b, 0xe8de45cb, 0xfff6210b, 0xc68e8c4b, 0xd1a6e88b, + 0xa4cbba8a, 0xb3e3de4a, 0x8a9b730a, 0x9db317ca, 0xf86a298a, + 0xef424d4a, 0xd63ae00a, 0xc11284ca, 0x1d889c8a, 0x0aa0f84a, + 0x33d8550a, 0x24f031ca, 0x41290f8a, 0x56016b4a, 0x6f79c60a, + 0x7851a2ca}, + {0x00000000, 0x9fda839e, 0xe4c4017d, 0x7b1e82e3, 0x12f904bb, + 0x8d238725, 0xf63d05c6, 0x69e78658, 0x25f20976, 0xba288ae8, + 0xc136080b, 0x5eec8b95, 0x370b0dcd, 0xa8d18e53, 0xd3cf0cb0, + 0x4c158f2e, 0x4be412ec, 0xd43e9172, 0xaf201391, 0x30fa900f, + 0x591d1657, 0xc6c795c9, 0xbdd9172a, 0x220394b4, 0x6e161b9a, + 0xf1cc9804, 0x8ad21ae7, 0x15089979, 0x7cef1f21, 0xe3359cbf, + 0x982b1e5c, 0x07f19dc2, 0x97c825d8, 0x0812a646, 0x730c24a5, + 0xecd6a73b, 0x85312163, 0x1aeba2fd, 0x61f5201e, 0xfe2fa380, + 0xb23a2cae, 0x2de0af30, 0x56fe2dd3, 0xc924ae4d, 0xa0c32815, + 0x3f19ab8b, 0x44072968, 0xdbddaaf6, 0xdc2c3734, 0x43f6b4aa, + 0x38e83649, 0xa732b5d7, 0xced5338f, 0x510fb011, 0x2a1132f2, + 0xb5cbb16c, 0xf9de3e42, 0x6604bddc, 0x1d1a3f3f, 0x82c0bca1, + 0xeb273af9, 0x74fdb967, 0x0fe33b84, 0x9039b81a, 0xf4e14df1, + 0x6b3bce6f, 0x10254c8c, 0x8fffcf12, 0xe618494a, 0x79c2cad4, + 0x02dc4837, 0x9d06cba9, 0xd1134487, 0x4ec9c719, 0x35d745fa, + 0xaa0dc664, 0xc3ea403c, 0x5c30c3a2, 0x272e4141, 0xb8f4c2df, + 0xbf055f1d, 0x20dfdc83, 0x5bc15e60, 0xc41bddfe, 0xadfc5ba6, + 0x3226d838, 0x49385adb, 0xd6e2d945, 0x9af7566b, 0x052dd5f5, + 0x7e335716, 0xe1e9d488, 0x880e52d0, 0x17d4d14e, 0x6cca53ad, + 0xf310d033, 0x63296829, 0xfcf3ebb7, 0x87ed6954, 0x1837eaca, + 0x71d06c92, 0xee0aef0c, 0x95146def, 0x0aceee71, 0x46db615f, + 0xd901e2c1, 0xa21f6022, 0x3dc5e3bc, 0x542265e4, 0xcbf8e67a, + 0xb0e66499, 0x2f3ce707, 0x28cd7ac5, 0xb717f95b, 0xcc097bb8, + 0x53d3f826, 0x3a347e7e, 0xa5eefde0, 0xdef07f03, 0x412afc9d, + 0x0d3f73b3, 0x92e5f02d, 0xe9fb72ce, 0x7621f150, 0x1fc67708, + 0x801cf496, 0xfb027675, 0x64d8f5eb, 0x32b39da3, 0xad691e3d, + 0xd6779cde, 0x49ad1f40, 0x204a9918, 0xbf901a86, 0xc48e9865, + 0x5b541bfb, 0x174194d5, 0x889b174b, 0xf38595a8, 0x6c5f1636, + 0x05b8906e, 0x9a6213f0, 0xe17c9113, 0x7ea6128d, 0x79578f4f, + 0xe68d0cd1, 0x9d938e32, 0x02490dac, 0x6bae8bf4, 0xf474086a, + 0x8f6a8a89, 0x10b00917, 0x5ca58639, 0xc37f05a7, 0xb8618744, + 0x27bb04da, 0x4e5c8282, 0xd186011c, 0xaa9883ff, 0x35420061, + 0xa57bb87b, 0x3aa13be5, 0x41bfb906, 0xde653a98, 0xb782bcc0, + 0x28583f5e, 0x5346bdbd, 0xcc9c3e23, 0x8089b10d, 0x1f533293, + 0x644db070, 0xfb9733ee, 0x9270b5b6, 0x0daa3628, 0x76b4b4cb, + 0xe96e3755, 0xee9faa97, 0x71452909, 0x0a5babea, 0x95812874, + 0xfc66ae2c, 0x63bc2db2, 0x18a2af51, 0x87782ccf, 0xcb6da3e1, + 0x54b7207f, 0x2fa9a29c, 0xb0732102, 0xd994a75a, 0x464e24c4, + 0x3d50a627, 0xa28a25b9, 0xc652d052, 0x598853cc, 0x2296d12f, + 0xbd4c52b1, 0xd4abd4e9, 0x4b715777, 0x306fd594, 0xafb5560a, + 0xe3a0d924, 0x7c7a5aba, 0x0764d859, 0x98be5bc7, 0xf159dd9f, + 0x6e835e01, 0x159ddce2, 0x8a475f7c, 0x8db6c2be, 0x126c4120, + 0x6972c3c3, 0xf6a8405d, 0x9f4fc605, 0x0095459b, 0x7b8bc778, + 0xe45144e6, 0xa844cbc8, 0x379e4856, 0x4c80cab5, 0xd35a492b, + 0xbabdcf73, 0x25674ced, 0x5e79ce0e, 0xc1a34d90, 0x519af58a, + 0xce407614, 0xb55ef4f7, 0x2a847769, 0x4363f131, 0xdcb972af, + 0xa7a7f04c, 0x387d73d2, 0x7468fcfc, 0xebb27f62, 0x90acfd81, + 0x0f767e1f, 0x6691f847, 0xf94b7bd9, 0x8255f93a, 0x1d8f7aa4, + 0x1a7ee766, 0x85a464f8, 0xfebae61b, 0x61606585, 0x0887e3dd, + 0x975d6043, 0xec43e2a0, 0x7399613e, 0x3f8cee10, 0xa0566d8e, + 0xdb48ef6d, 0x44926cf3, 0x2d75eaab, 0xb2af6935, 0xc9b1ebd6, + 0x566b6848}, + {0x00000000, 0x65673b46, 0xcace768c, 0xafa94dca, 0x4eedeb59, + 0x2b8ad01f, 0x84239dd5, 0xe144a693, 0x9ddbd6b2, 0xf8bcedf4, + 0x5715a03e, 0x32729b78, 0xd3363deb, 0xb65106ad, 0x19f84b67, + 0x7c9f7021, 0xe0c6ab25, 0x85a19063, 0x2a08dda9, 0x4f6fe6ef, + 0xae2b407c, 0xcb4c7b3a, 0x64e536f0, 0x01820db6, 0x7d1d7d97, + 0x187a46d1, 0xb7d30b1b, 0xd2b4305d, 0x33f096ce, 0x5697ad88, + 0xf93ee042, 0x9c59db04, 0x1afc500b, 0x7f9b6b4d, 0xd0322687, + 0xb5551dc1, 0x5411bb52, 0x31768014, 0x9edfcdde, 0xfbb8f698, + 0x872786b9, 0xe240bdff, 0x4de9f035, 0x288ecb73, 0xc9ca6de0, + 0xacad56a6, 0x03041b6c, 0x6663202a, 0xfa3afb2e, 0x9f5dc068, + 0x30f48da2, 0x5593b6e4, 0xb4d71077, 0xd1b02b31, 0x7e1966fb, + 0x1b7e5dbd, 0x67e12d9c, 0x028616da, 0xad2f5b10, 0xc8486056, + 0x290cc6c5, 0x4c6bfd83, 0xe3c2b049, 0x86a58b0f, 0x35f8a016, + 0x509f9b50, 0xff36d69a, 0x9a51eddc, 0x7b154b4f, 0x1e727009, + 0xb1db3dc3, 0xd4bc0685, 0xa82376a4, 0xcd444de2, 0x62ed0028, + 0x078a3b6e, 0xe6ce9dfd, 0x83a9a6bb, 0x2c00eb71, 0x4967d037, + 0xd53e0b33, 0xb0593075, 0x1ff07dbf, 0x7a9746f9, 0x9bd3e06a, + 0xfeb4db2c, 0x511d96e6, 0x347aada0, 0x48e5dd81, 0x2d82e6c7, + 0x822bab0d, 0xe74c904b, 0x060836d8, 0x636f0d9e, 0xccc64054, + 0xa9a17b12, 0x2f04f01d, 0x4a63cb5b, 0xe5ca8691, 0x80adbdd7, + 0x61e91b44, 0x048e2002, 0xab276dc8, 0xce40568e, 0xb2df26af, + 0xd7b81de9, 0x78115023, 0x1d766b65, 0xfc32cdf6, 0x9955f6b0, + 0x36fcbb7a, 0x539b803c, 0xcfc25b38, 0xaaa5607e, 0x050c2db4, + 0x606b16f2, 0x812fb061, 0xe4488b27, 0x4be1c6ed, 0x2e86fdab, + 0x52198d8a, 0x377eb6cc, 0x98d7fb06, 0xfdb0c040, 0x1cf466d3, + 0x79935d95, 0xd63a105f, 0xb35d2b19, 0x6bf1402c, 0x0e967b6a, + 0xa13f36a0, 0xc4580de6, 0x251cab75, 0x407b9033, 0xefd2ddf9, + 0x8ab5e6bf, 0xf62a969e, 0x934dadd8, 0x3ce4e012, 0x5983db54, + 0xb8c77dc7, 0xdda04681, 0x72090b4b, 0x176e300d, 0x8b37eb09, + 0xee50d04f, 0x41f99d85, 0x249ea6c3, 0xc5da0050, 0xa0bd3b16, + 0x0f1476dc, 0x6a734d9a, 0x16ec3dbb, 0x738b06fd, 0xdc224b37, + 0xb9457071, 0x5801d6e2, 0x3d66eda4, 0x92cfa06e, 0xf7a89b28, + 0x710d1027, 0x146a2b61, 0xbbc366ab, 0xdea45ded, 0x3fe0fb7e, + 0x5a87c038, 0xf52e8df2, 0x9049b6b4, 0xecd6c695, 0x89b1fdd3, + 0x2618b019, 0x437f8b5f, 0xa23b2dcc, 0xc75c168a, 0x68f55b40, + 0x0d926006, 0x91cbbb02, 0xf4ac8044, 0x5b05cd8e, 0x3e62f6c8, + 0xdf26505b, 0xba416b1d, 0x15e826d7, 0x708f1d91, 0x0c106db0, + 0x697756f6, 0xc6de1b3c, 0xa3b9207a, 0x42fd86e9, 0x279abdaf, + 0x8833f065, 0xed54cb23, 0x5e09e03a, 0x3b6edb7c, 0x94c796b6, + 0xf1a0adf0, 0x10e40b63, 0x75833025, 0xda2a7def, 0xbf4d46a9, + 0xc3d23688, 0xa6b50dce, 0x091c4004, 0x6c7b7b42, 0x8d3fddd1, + 0xe858e697, 0x47f1ab5d, 0x2296901b, 0xbecf4b1f, 0xdba87059, + 0x74013d93, 0x116606d5, 0xf022a046, 0x95459b00, 0x3aecd6ca, + 0x5f8bed8c, 0x23149dad, 0x4673a6eb, 0xe9daeb21, 0x8cbdd067, + 0x6df976f4, 0x089e4db2, 0xa7370078, 0xc2503b3e, 0x44f5b031, + 0x21928b77, 0x8e3bc6bd, 0xeb5cfdfb, 0x0a185b68, 0x6f7f602e, + 0xc0d62de4, 0xa5b116a2, 0xd92e6683, 0xbc495dc5, 0x13e0100f, + 0x76872b49, 0x97c38dda, 0xf2a4b69c, 0x5d0dfb56, 0x386ac010, + 0xa4331b14, 0xc1542052, 0x6efd6d98, 0x0b9a56de, 0xeadef04d, + 0x8fb9cb0b, 0x201086c1, 0x4577bd87, 0x39e8cda6, 0x5c8ff6e0, + 0xf326bb2a, 0x9641806c, 0x770526ff, 0x12621db9, 0xbdcb5073, + 0xd8ac6b35}, + {0x00000000, 0xd7e28058, 0x74b406f1, 0xa35686a9, 0xe9680de2, + 0x3e8a8dba, 0x9ddc0b13, 0x4a3e8b4b, 0x09a11d85, 0xde439ddd, + 0x7d151b74, 0xaaf79b2c, 0xe0c91067, 0x372b903f, 0x947d1696, + 0x439f96ce, 0x13423b0a, 0xc4a0bb52, 0x67f63dfb, 0xb014bda3, + 0xfa2a36e8, 0x2dc8b6b0, 0x8e9e3019, 0x597cb041, 0x1ae3268f, + 0xcd01a6d7, 0x6e57207e, 0xb9b5a026, 0xf38b2b6d, 0x2469ab35, + 0x873f2d9c, 0x50ddadc4, 0x26847614, 0xf166f64c, 0x523070e5, + 0x85d2f0bd, 0xcfec7bf6, 0x180efbae, 0xbb587d07, 0x6cbafd5f, + 0x2f256b91, 0xf8c7ebc9, 0x5b916d60, 0x8c73ed38, 0xc64d6673, + 0x11afe62b, 0xb2f96082, 0x651be0da, 0x35c64d1e, 0xe224cd46, + 0x41724bef, 0x9690cbb7, 0xdcae40fc, 0x0b4cc0a4, 0xa81a460d, + 0x7ff8c655, 0x3c67509b, 0xeb85d0c3, 0x48d3566a, 0x9f31d632, + 0xd50f5d79, 0x02eddd21, 0xa1bb5b88, 0x7659dbd0, 0x4d08ec28, + 0x9aea6c70, 0x39bcead9, 0xee5e6a81, 0xa460e1ca, 0x73826192, + 0xd0d4e73b, 0x07366763, 0x44a9f1ad, 0x934b71f5, 0x301df75c, + 0xe7ff7704, 0xadc1fc4f, 0x7a237c17, 0xd975fabe, 0x0e977ae6, + 0x5e4ad722, 0x89a8577a, 0x2afed1d3, 0xfd1c518b, 0xb722dac0, + 0x60c05a98, 0xc396dc31, 0x14745c69, 0x57ebcaa7, 0x80094aff, + 0x235fcc56, 0xf4bd4c0e, 0xbe83c745, 0x6961471d, 0xca37c1b4, + 0x1dd541ec, 0x6b8c9a3c, 0xbc6e1a64, 0x1f389ccd, 0xc8da1c95, + 0x82e497de, 0x55061786, 0xf650912f, 0x21b21177, 0x622d87b9, + 0xb5cf07e1, 0x16998148, 0xc17b0110, 0x8b458a5b, 0x5ca70a03, + 0xfff18caa, 0x28130cf2, 0x78cea136, 0xaf2c216e, 0x0c7aa7c7, + 0xdb98279f, 0x91a6acd4, 0x46442c8c, 0xe512aa25, 0x32f02a7d, + 0x716fbcb3, 0xa68d3ceb, 0x05dbba42, 0xd2393a1a, 0x9807b151, + 0x4fe53109, 0xecb3b7a0, 0x3b5137f8, 0x9a11d850, 0x4df35808, + 0xeea5dea1, 0x39475ef9, 0x7379d5b2, 0xa49b55ea, 0x07cdd343, + 0xd02f531b, 0x93b0c5d5, 0x4452458d, 0xe704c324, 0x30e6437c, + 0x7ad8c837, 0xad3a486f, 0x0e6ccec6, 0xd98e4e9e, 0x8953e35a, + 0x5eb16302, 0xfde7e5ab, 0x2a0565f3, 0x603beeb8, 0xb7d96ee0, + 0x148fe849, 0xc36d6811, 0x80f2fedf, 0x57107e87, 0xf446f82e, + 0x23a47876, 0x699af33d, 0xbe787365, 0x1d2ef5cc, 0xcacc7594, + 0xbc95ae44, 0x6b772e1c, 0xc821a8b5, 0x1fc328ed, 0x55fda3a6, + 0x821f23fe, 0x2149a557, 0xf6ab250f, 0xb534b3c1, 0x62d63399, + 0xc180b530, 0x16623568, 0x5c5cbe23, 0x8bbe3e7b, 0x28e8b8d2, + 0xff0a388a, 0xafd7954e, 0x78351516, 0xdb6393bf, 0x0c8113e7, + 0x46bf98ac, 0x915d18f4, 0x320b9e5d, 0xe5e91e05, 0xa67688cb, + 0x71940893, 0xd2c28e3a, 0x05200e62, 0x4f1e8529, 0x98fc0571, + 0x3baa83d8, 0xec480380, 0xd7193478, 0x00fbb420, 0xa3ad3289, + 0x744fb2d1, 0x3e71399a, 0xe993b9c2, 0x4ac53f6b, 0x9d27bf33, + 0xdeb829fd, 0x095aa9a5, 0xaa0c2f0c, 0x7deeaf54, 0x37d0241f, + 0xe032a447, 0x436422ee, 0x9486a2b6, 0xc45b0f72, 0x13b98f2a, + 0xb0ef0983, 0x670d89db, 0x2d330290, 0xfad182c8, 0x59870461, + 0x8e658439, 0xcdfa12f7, 0x1a1892af, 0xb94e1406, 0x6eac945e, + 0x24921f15, 0xf3709f4d, 0x502619e4, 0x87c499bc, 0xf19d426c, + 0x267fc234, 0x8529449d, 0x52cbc4c5, 0x18f54f8e, 0xcf17cfd6, + 0x6c41497f, 0xbba3c927, 0xf83c5fe9, 0x2fdedfb1, 0x8c885918, + 0x5b6ad940, 0x1154520b, 0xc6b6d253, 0x65e054fa, 0xb202d4a2, + 0xe2df7966, 0x353df93e, 0x966b7f97, 0x4189ffcf, 0x0bb77484, + 0xdc55f4dc, 0x7f037275, 0xa8e1f22d, 0xeb7e64e3, 0x3c9ce4bb, + 0x9fca6212, 0x4828e24a, 0x02166901, 0xd5f4e959, 0x76a26ff0, + 0xa140efa8}, + {0x00000000, 0xef52b6e1, 0x05d46b83, 0xea86dd62, 0x0ba8d706, + 0xe4fa61e7, 0x0e7cbc85, 0xe12e0a64, 0x1751ae0c, 0xf80318ed, + 0x1285c58f, 0xfdd7736e, 0x1cf9790a, 0xf3abcfeb, 0x192d1289, + 0xf67fa468, 0x2ea35c18, 0xc1f1eaf9, 0x2b77379b, 0xc425817a, + 0x250b8b1e, 0xca593dff, 0x20dfe09d, 0xcf8d567c, 0x39f2f214, + 0xd6a044f5, 0x3c269997, 0xd3742f76, 0x325a2512, 0xdd0893f3, + 0x378e4e91, 0xd8dcf870, 0x5d46b830, 0xb2140ed1, 0x5892d3b3, + 0xb7c06552, 0x56ee6f36, 0xb9bcd9d7, 0x533a04b5, 0xbc68b254, + 0x4a17163c, 0xa545a0dd, 0x4fc37dbf, 0xa091cb5e, 0x41bfc13a, + 0xaeed77db, 0x446baab9, 0xab391c58, 0x73e5e428, 0x9cb752c9, + 0x76318fab, 0x9963394a, 0x784d332e, 0x971f85cf, 0x7d9958ad, + 0x92cbee4c, 0x64b44a24, 0x8be6fcc5, 0x616021a7, 0x8e329746, + 0x6f1c9d22, 0x804e2bc3, 0x6ac8f6a1, 0x859a4040, 0xba8d7060, + 0x55dfc681, 0xbf591be3, 0x500bad02, 0xb125a766, 0x5e771187, + 0xb4f1cce5, 0x5ba37a04, 0xaddcde6c, 0x428e688d, 0xa808b5ef, + 0x475a030e, 0xa674096a, 0x4926bf8b, 0xa3a062e9, 0x4cf2d408, + 0x942e2c78, 0x7b7c9a99, 0x91fa47fb, 0x7ea8f11a, 0x9f86fb7e, + 0x70d44d9f, 0x9a5290fd, 0x7500261c, 0x837f8274, 0x6c2d3495, + 0x86abe9f7, 0x69f95f16, 0x88d75572, 0x6785e393, 0x8d033ef1, + 0x62518810, 0xe7cbc850, 0x08997eb1, 0xe21fa3d3, 0x0d4d1532, + 0xec631f56, 0x0331a9b7, 0xe9b774d5, 0x06e5c234, 0xf09a665c, + 0x1fc8d0bd, 0xf54e0ddf, 0x1a1cbb3e, 0xfb32b15a, 0x146007bb, + 0xfee6dad9, 0x11b46c38, 0xc9689448, 0x263a22a9, 0xccbcffcb, + 0x23ee492a, 0xc2c0434e, 0x2d92f5af, 0xc71428cd, 0x28469e2c, + 0xde393a44, 0x316b8ca5, 0xdbed51c7, 0x34bfe726, 0xd591ed42, + 0x3ac35ba3, 0xd04586c1, 0x3f173020, 0xae6be681, 0x41395060, + 0xabbf8d02, 0x44ed3be3, 0xa5c33187, 0x4a918766, 0xa0175a04, + 0x4f45ece5, 0xb93a488d, 0x5668fe6c, 0xbcee230e, 0x53bc95ef, + 0xb2929f8b, 0x5dc0296a, 0xb746f408, 0x581442e9, 0x80c8ba99, + 0x6f9a0c78, 0x851cd11a, 0x6a4e67fb, 0x8b606d9f, 0x6432db7e, + 0x8eb4061c, 0x61e6b0fd, 0x97991495, 0x78cba274, 0x924d7f16, + 0x7d1fc9f7, 0x9c31c393, 0x73637572, 0x99e5a810, 0x76b71ef1, + 0xf32d5eb1, 0x1c7fe850, 0xf6f93532, 0x19ab83d3, 0xf88589b7, + 0x17d73f56, 0xfd51e234, 0x120354d5, 0xe47cf0bd, 0x0b2e465c, + 0xe1a89b3e, 0x0efa2ddf, 0xefd427bb, 0x0086915a, 0xea004c38, + 0x0552fad9, 0xdd8e02a9, 0x32dcb448, 0xd85a692a, 0x3708dfcb, + 0xd626d5af, 0x3974634e, 0xd3f2be2c, 0x3ca008cd, 0xcadfaca5, + 0x258d1a44, 0xcf0bc726, 0x205971c7, 0xc1777ba3, 0x2e25cd42, + 0xc4a31020, 0x2bf1a6c1, 0x14e696e1, 0xfbb42000, 0x1132fd62, + 0xfe604b83, 0x1f4e41e7, 0xf01cf706, 0x1a9a2a64, 0xf5c89c85, + 0x03b738ed, 0xece58e0c, 0x0663536e, 0xe931e58f, 0x081fefeb, + 0xe74d590a, 0x0dcb8468, 0xe2993289, 0x3a45caf9, 0xd5177c18, + 0x3f91a17a, 0xd0c3179b, 0x31ed1dff, 0xdebfab1e, 0x3439767c, + 0xdb6bc09d, 0x2d1464f5, 0xc246d214, 0x28c00f76, 0xc792b997, + 0x26bcb3f3, 0xc9ee0512, 0x2368d870, 0xcc3a6e91, 0x49a02ed1, + 0xa6f29830, 0x4c744552, 0xa326f3b3, 0x4208f9d7, 0xad5a4f36, + 0x47dc9254, 0xa88e24b5, 0x5ef180dd, 0xb1a3363c, 0x5b25eb5e, + 0xb4775dbf, 0x555957db, 0xba0be13a, 0x508d3c58, 0xbfdf8ab9, + 0x670372c9, 0x8851c428, 0x62d7194a, 0x8d85afab, 0x6caba5cf, + 0x83f9132e, 0x697fce4c, 0x862d78ad, 0x7052dcc5, 0x9f006a24, + 0x7586b746, 0x9ad401a7, 0x7bfa0bc3, 0x94a8bd22, 0x7e2e6040, + 0x917cd6a1}, + {0x00000000, 0x87a6cb43, 0xd43c90c7, 0x539a5b84, 0x730827cf, + 0xf4aeec8c, 0xa734b708, 0x20927c4b, 0xe6104f9e, 0x61b684dd, + 0x322cdf59, 0xb58a141a, 0x95186851, 0x12bea312, 0x4124f896, + 0xc68233d5, 0x1751997d, 0x90f7523e, 0xc36d09ba, 0x44cbc2f9, + 0x6459beb2, 0xe3ff75f1, 0xb0652e75, 0x37c3e536, 0xf141d6e3, + 0x76e71da0, 0x257d4624, 0xa2db8d67, 0x8249f12c, 0x05ef3a6f, + 0x567561eb, 0xd1d3aaa8, 0x2ea332fa, 0xa905f9b9, 0xfa9fa23d, + 0x7d39697e, 0x5dab1535, 0xda0dde76, 0x899785f2, 0x0e314eb1, + 0xc8b37d64, 0x4f15b627, 0x1c8feda3, 0x9b2926e0, 0xbbbb5aab, + 0x3c1d91e8, 0x6f87ca6c, 0xe821012f, 0x39f2ab87, 0xbe5460c4, + 0xedce3b40, 0x6a68f003, 0x4afa8c48, 0xcd5c470b, 0x9ec61c8f, + 0x1960d7cc, 0xdfe2e419, 0x58442f5a, 0x0bde74de, 0x8c78bf9d, + 0xaceac3d6, 0x2b4c0895, 0x78d65311, 0xff709852, 0x5d4665f4, + 0xdae0aeb7, 0x897af533, 0x0edc3e70, 0x2e4e423b, 0xa9e88978, + 0xfa72d2fc, 0x7dd419bf, 0xbb562a6a, 0x3cf0e129, 0x6f6abaad, + 0xe8cc71ee, 0xc85e0da5, 0x4ff8c6e6, 0x1c629d62, 0x9bc45621, + 0x4a17fc89, 0xcdb137ca, 0x9e2b6c4e, 0x198da70d, 0x391fdb46, + 0xbeb91005, 0xed234b81, 0x6a8580c2, 0xac07b317, 0x2ba17854, + 0x783b23d0, 0xff9de893, 0xdf0f94d8, 0x58a95f9b, 0x0b33041f, + 0x8c95cf5c, 0x73e5570e, 0xf4439c4d, 0xa7d9c7c9, 0x207f0c8a, + 0x00ed70c1, 0x874bbb82, 0xd4d1e006, 0x53772b45, 0x95f51890, + 0x1253d3d3, 0x41c98857, 0xc66f4314, 0xe6fd3f5f, 0x615bf41c, + 0x32c1af98, 0xb56764db, 0x64b4ce73, 0xe3120530, 0xb0885eb4, + 0x372e95f7, 0x17bce9bc, 0x901a22ff, 0xc380797b, 0x4426b238, + 0x82a481ed, 0x05024aae, 0x5698112a, 0xd13eda69, 0xf1aca622, + 0x760a6d61, 0x259036e5, 0xa236fda6, 0xba8ccbe8, 0x3d2a00ab, + 0x6eb05b2f, 0xe916906c, 0xc984ec27, 0x4e222764, 0x1db87ce0, + 0x9a1eb7a3, 0x5c9c8476, 0xdb3a4f35, 0x88a014b1, 0x0f06dff2, + 0x2f94a3b9, 0xa83268fa, 0xfba8337e, 0x7c0ef83d, 0xaddd5295, + 0x2a7b99d6, 0x79e1c252, 0xfe470911, 0xded5755a, 0x5973be19, + 0x0ae9e59d, 0x8d4f2ede, 0x4bcd1d0b, 0xcc6bd648, 0x9ff18dcc, + 0x1857468f, 0x38c53ac4, 0xbf63f187, 0xecf9aa03, 0x6b5f6140, + 0x942ff912, 0x13893251, 0x401369d5, 0xc7b5a296, 0xe727dedd, + 0x6081159e, 0x331b4e1a, 0xb4bd8559, 0x723fb68c, 0xf5997dcf, + 0xa603264b, 0x21a5ed08, 0x01379143, 0x86915a00, 0xd50b0184, + 0x52adcac7, 0x837e606f, 0x04d8ab2c, 0x5742f0a8, 0xd0e43beb, + 0xf07647a0, 0x77d08ce3, 0x244ad767, 0xa3ec1c24, 0x656e2ff1, + 0xe2c8e4b2, 0xb152bf36, 0x36f47475, 0x1666083e, 0x91c0c37d, + 0xc25a98f9, 0x45fc53ba, 0xe7caae1c, 0x606c655f, 0x33f63edb, + 0xb450f598, 0x94c289d3, 0x13644290, 0x40fe1914, 0xc758d257, + 0x01dae182, 0x867c2ac1, 0xd5e67145, 0x5240ba06, 0x72d2c64d, + 0xf5740d0e, 0xa6ee568a, 0x21489dc9, 0xf09b3761, 0x773dfc22, + 0x24a7a7a6, 0xa3016ce5, 0x839310ae, 0x0435dbed, 0x57af8069, + 0xd0094b2a, 0x168b78ff, 0x912db3bc, 0xc2b7e838, 0x4511237b, + 0x65835f30, 0xe2259473, 0xb1bfcff7, 0x361904b4, 0xc9699ce6, + 0x4ecf57a5, 0x1d550c21, 0x9af3c762, 0xba61bb29, 0x3dc7706a, + 0x6e5d2bee, 0xe9fbe0ad, 0x2f79d378, 0xa8df183b, 0xfb4543bf, + 0x7ce388fc, 0x5c71f4b7, 0xdbd73ff4, 0x884d6470, 0x0febaf33, + 0xde38059b, 0x599eced8, 0x0a04955c, 0x8da25e1f, 0xad302254, + 0x2a96e917, 0x790cb293, 0xfeaa79d0, 0x38284a05, 0xbf8e8146, + 0xec14dac2, 0x6bb21181, 0x4b206dca, 0xcc86a689, 0x9f1cfd0d, + 0x18ba364e}}; + +local const z_word_t FAR crc_braid_big_table[][256] = { + {0x0000000000000000, 0x43cba68700000000, 0xc7903cd400000000, + 0x845b9a5300000000, 0xcf27087300000000, 0x8cecaef400000000, + 0x08b734a700000000, 0x4b7c922000000000, 0x9e4f10e600000000, + 0xdd84b66100000000, 0x59df2c3200000000, 0x1a148ab500000000, + 0x5168189500000000, 0x12a3be1200000000, 0x96f8244100000000, + 0xd53382c600000000, 0x7d99511700000000, 0x3e52f79000000000, + 0xba096dc300000000, 0xf9c2cb4400000000, 0xb2be596400000000, + 0xf175ffe300000000, 0x752e65b000000000, 0x36e5c33700000000, + 0xe3d641f100000000, 0xa01de77600000000, 0x24467d2500000000, + 0x678ddba200000000, 0x2cf1498200000000, 0x6f3aef0500000000, + 0xeb61755600000000, 0xa8aad3d100000000, 0xfa32a32e00000000, + 0xb9f905a900000000, 0x3da29ffa00000000, 0x7e69397d00000000, + 0x3515ab5d00000000, 0x76de0dda00000000, 0xf285978900000000, + 0xb14e310e00000000, 0x647db3c800000000, 0x27b6154f00000000, + 0xa3ed8f1c00000000, 0xe026299b00000000, 0xab5abbbb00000000, + 0xe8911d3c00000000, 0x6cca876f00000000, 0x2f0121e800000000, + 0x87abf23900000000, 0xc46054be00000000, 0x403bceed00000000, + 0x03f0686a00000000, 0x488cfa4a00000000, 0x0b475ccd00000000, + 0x8f1cc69e00000000, 0xccd7601900000000, 0x19e4e2df00000000, + 0x5a2f445800000000, 0xde74de0b00000000, 0x9dbf788c00000000, + 0xd6c3eaac00000000, 0x95084c2b00000000, 0x1153d67800000000, + 0x529870ff00000000, 0xf465465d00000000, 0xb7aee0da00000000, + 0x33f57a8900000000, 0x703edc0e00000000, 0x3b424e2e00000000, + 0x7889e8a900000000, 0xfcd272fa00000000, 0xbf19d47d00000000, + 0x6a2a56bb00000000, 0x29e1f03c00000000, 0xadba6a6f00000000, + 0xee71cce800000000, 0xa50d5ec800000000, 0xe6c6f84f00000000, + 0x629d621c00000000, 0x2156c49b00000000, 0x89fc174a00000000, + 0xca37b1cd00000000, 0x4e6c2b9e00000000, 0x0da78d1900000000, + 0x46db1f3900000000, 0x0510b9be00000000, 0x814b23ed00000000, + 0xc280856a00000000, 0x17b307ac00000000, 0x5478a12b00000000, + 0xd0233b7800000000, 0x93e89dff00000000, 0xd8940fdf00000000, + 0x9b5fa95800000000, 0x1f04330b00000000, 0x5ccf958c00000000, + 0x0e57e57300000000, 0x4d9c43f400000000, 0xc9c7d9a700000000, + 0x8a0c7f2000000000, 0xc170ed0000000000, 0x82bb4b8700000000, + 0x06e0d1d400000000, 0x452b775300000000, 0x9018f59500000000, + 0xd3d3531200000000, 0x5788c94100000000, 0x14436fc600000000, + 0x5f3ffde600000000, 0x1cf45b6100000000, 0x98afc13200000000, + 0xdb6467b500000000, 0x73ceb46400000000, 0x300512e300000000, + 0xb45e88b000000000, 0xf7952e3700000000, 0xbce9bc1700000000, + 0xff221a9000000000, 0x7b7980c300000000, 0x38b2264400000000, + 0xed81a48200000000, 0xae4a020500000000, 0x2a11985600000000, + 0x69da3ed100000000, 0x22a6acf100000000, 0x616d0a7600000000, + 0xe536902500000000, 0xa6fd36a200000000, 0xe8cb8cba00000000, + 0xab002a3d00000000, 0x2f5bb06e00000000, 0x6c9016e900000000, + 0x27ec84c900000000, 0x6427224e00000000, 0xe07cb81d00000000, + 0xa3b71e9a00000000, 0x76849c5c00000000, 0x354f3adb00000000, + 0xb114a08800000000, 0xf2df060f00000000, 0xb9a3942f00000000, + 0xfa6832a800000000, 0x7e33a8fb00000000, 0x3df80e7c00000000, + 0x9552ddad00000000, 0xd6997b2a00000000, 0x52c2e17900000000, + 0x110947fe00000000, 0x5a75d5de00000000, 0x19be735900000000, + 0x9de5e90a00000000, 0xde2e4f8d00000000, 0x0b1dcd4b00000000, + 0x48d66bcc00000000, 0xcc8df19f00000000, 0x8f46571800000000, + 0xc43ac53800000000, 0x87f163bf00000000, 0x03aaf9ec00000000, + 0x40615f6b00000000, 0x12f92f9400000000, 0x5132891300000000, + 0xd569134000000000, 0x96a2b5c700000000, 0xddde27e700000000, + 0x9e15816000000000, 0x1a4e1b3300000000, 0x5985bdb400000000, + 0x8cb63f7200000000, 0xcf7d99f500000000, 0x4b2603a600000000, + 0x08eda52100000000, 0x4391370100000000, 0x005a918600000000, + 0x84010bd500000000, 0xc7caad5200000000, 0x6f607e8300000000, + 0x2cabd80400000000, 0xa8f0425700000000, 0xeb3be4d000000000, + 0xa04776f000000000, 0xe38cd07700000000, 0x67d74a2400000000, + 0x241ceca300000000, 0xf12f6e6500000000, 0xb2e4c8e200000000, + 0x36bf52b100000000, 0x7574f43600000000, 0x3e08661600000000, + 0x7dc3c09100000000, 0xf9985ac200000000, 0xba53fc4500000000, + 0x1caecae700000000, 0x5f656c6000000000, 0xdb3ef63300000000, + 0x98f550b400000000, 0xd389c29400000000, 0x9042641300000000, + 0x1419fe4000000000, 0x57d258c700000000, 0x82e1da0100000000, + 0xc12a7c8600000000, 0x4571e6d500000000, 0x06ba405200000000, + 0x4dc6d27200000000, 0x0e0d74f500000000, 0x8a56eea600000000, + 0xc99d482100000000, 0x61379bf000000000, 0x22fc3d7700000000, + 0xa6a7a72400000000, 0xe56c01a300000000, 0xae10938300000000, + 0xeddb350400000000, 0x6980af5700000000, 0x2a4b09d000000000, + 0xff788b1600000000, 0xbcb32d9100000000, 0x38e8b7c200000000, + 0x7b23114500000000, 0x305f836500000000, 0x739425e200000000, + 0xf7cfbfb100000000, 0xb404193600000000, 0xe69c69c900000000, + 0xa557cf4e00000000, 0x210c551d00000000, 0x62c7f39a00000000, + 0x29bb61ba00000000, 0x6a70c73d00000000, 0xee2b5d6e00000000, + 0xade0fbe900000000, 0x78d3792f00000000, 0x3b18dfa800000000, + 0xbf4345fb00000000, 0xfc88e37c00000000, 0xb7f4715c00000000, + 0xf43fd7db00000000, 0x70644d8800000000, 0x33afeb0f00000000, + 0x9b0538de00000000, 0xd8ce9e5900000000, 0x5c95040a00000000, + 0x1f5ea28d00000000, 0x542230ad00000000, 0x17e9962a00000000, + 0x93b20c7900000000, 0xd079aafe00000000, 0x054a283800000000, + 0x46818ebf00000000, 0xc2da14ec00000000, 0x8111b26b00000000, + 0xca6d204b00000000, 0x89a686cc00000000, 0x0dfd1c9f00000000, + 0x4e36ba1800000000}, + {0x0000000000000000, 0xe1b652ef00000000, 0x836bd40500000000, + 0x62dd86ea00000000, 0x06d7a80b00000000, 0xe761fae400000000, + 0x85bc7c0e00000000, 0x640a2ee100000000, 0x0cae511700000000, + 0xed1803f800000000, 0x8fc5851200000000, 0x6e73d7fd00000000, + 0x0a79f91c00000000, 0xebcfabf300000000, 0x89122d1900000000, + 0x68a47ff600000000, 0x185ca32e00000000, 0xf9eaf1c100000000, + 0x9b37772b00000000, 0x7a8125c400000000, 0x1e8b0b2500000000, + 0xff3d59ca00000000, 0x9de0df2000000000, 0x7c568dcf00000000, + 0x14f2f23900000000, 0xf544a0d600000000, 0x9799263c00000000, + 0x762f74d300000000, 0x12255a3200000000, 0xf39308dd00000000, + 0x914e8e3700000000, 0x70f8dcd800000000, 0x30b8465d00000000, + 0xd10e14b200000000, 0xb3d3925800000000, 0x5265c0b700000000, + 0x366fee5600000000, 0xd7d9bcb900000000, 0xb5043a5300000000, + 0x54b268bc00000000, 0x3c16174a00000000, 0xdda045a500000000, + 0xbf7dc34f00000000, 0x5ecb91a000000000, 0x3ac1bf4100000000, + 0xdb77edae00000000, 0xb9aa6b4400000000, 0x581c39ab00000000, + 0x28e4e57300000000, 0xc952b79c00000000, 0xab8f317600000000, + 0x4a39639900000000, 0x2e334d7800000000, 0xcf851f9700000000, + 0xad58997d00000000, 0x4ceecb9200000000, 0x244ab46400000000, + 0xc5fce68b00000000, 0xa721606100000000, 0x4697328e00000000, + 0x229d1c6f00000000, 0xc32b4e8000000000, 0xa1f6c86a00000000, + 0x40409a8500000000, 0x60708dba00000000, 0x81c6df5500000000, + 0xe31b59bf00000000, 0x02ad0b5000000000, 0x66a725b100000000, + 0x8711775e00000000, 0xe5ccf1b400000000, 0x047aa35b00000000, + 0x6cdedcad00000000, 0x8d688e4200000000, 0xefb508a800000000, + 0x0e035a4700000000, 0x6a0974a600000000, 0x8bbf264900000000, + 0xe962a0a300000000, 0x08d4f24c00000000, 0x782c2e9400000000, + 0x999a7c7b00000000, 0xfb47fa9100000000, 0x1af1a87e00000000, + 0x7efb869f00000000, 0x9f4dd47000000000, 0xfd90529a00000000, + 0x1c26007500000000, 0x74827f8300000000, 0x95342d6c00000000, + 0xf7e9ab8600000000, 0x165ff96900000000, 0x7255d78800000000, + 0x93e3856700000000, 0xf13e038d00000000, 0x1088516200000000, + 0x50c8cbe700000000, 0xb17e990800000000, 0xd3a31fe200000000, + 0x32154d0d00000000, 0x561f63ec00000000, 0xb7a9310300000000, + 0xd574b7e900000000, 0x34c2e50600000000, 0x5c669af000000000, + 0xbdd0c81f00000000, 0xdf0d4ef500000000, 0x3ebb1c1a00000000, + 0x5ab132fb00000000, 0xbb07601400000000, 0xd9dae6fe00000000, + 0x386cb41100000000, 0x489468c900000000, 0xa9223a2600000000, + 0xcbffbccc00000000, 0x2a49ee2300000000, 0x4e43c0c200000000, + 0xaff5922d00000000, 0xcd2814c700000000, 0x2c9e462800000000, + 0x443a39de00000000, 0xa58c6b3100000000, 0xc751eddb00000000, + 0x26e7bf3400000000, 0x42ed91d500000000, 0xa35bc33a00000000, + 0xc18645d000000000, 0x2030173f00000000, 0x81e66bae00000000, + 0x6050394100000000, 0x028dbfab00000000, 0xe33bed4400000000, + 0x8731c3a500000000, 0x6687914a00000000, 0x045a17a000000000, + 0xe5ec454f00000000, 0x8d483ab900000000, 0x6cfe685600000000, + 0x0e23eebc00000000, 0xef95bc5300000000, 0x8b9f92b200000000, + 0x6a29c05d00000000, 0x08f446b700000000, 0xe942145800000000, + 0x99bac88000000000, 0x780c9a6f00000000, 0x1ad11c8500000000, + 0xfb674e6a00000000, 0x9f6d608b00000000, 0x7edb326400000000, + 0x1c06b48e00000000, 0xfdb0e66100000000, 0x9514999700000000, + 0x74a2cb7800000000, 0x167f4d9200000000, 0xf7c91f7d00000000, + 0x93c3319c00000000, 0x7275637300000000, 0x10a8e59900000000, + 0xf11eb77600000000, 0xb15e2df300000000, 0x50e87f1c00000000, + 0x3235f9f600000000, 0xd383ab1900000000, 0xb78985f800000000, + 0x563fd71700000000, 0x34e251fd00000000, 0xd554031200000000, + 0xbdf07ce400000000, 0x5c462e0b00000000, 0x3e9ba8e100000000, + 0xdf2dfa0e00000000, 0xbb27d4ef00000000, 0x5a91860000000000, + 0x384c00ea00000000, 0xd9fa520500000000, 0xa9028edd00000000, + 0x48b4dc3200000000, 0x2a695ad800000000, 0xcbdf083700000000, + 0xafd526d600000000, 0x4e63743900000000, 0x2cbef2d300000000, + 0xcd08a03c00000000, 0xa5acdfca00000000, 0x441a8d2500000000, + 0x26c70bcf00000000, 0xc771592000000000, 0xa37b77c100000000, + 0x42cd252e00000000, 0x2010a3c400000000, 0xc1a6f12b00000000, + 0xe196e61400000000, 0x0020b4fb00000000, 0x62fd321100000000, + 0x834b60fe00000000, 0xe7414e1f00000000, 0x06f71cf000000000, + 0x642a9a1a00000000, 0x859cc8f500000000, 0xed38b70300000000, + 0x0c8ee5ec00000000, 0x6e53630600000000, 0x8fe531e900000000, + 0xebef1f0800000000, 0x0a594de700000000, 0x6884cb0d00000000, + 0x893299e200000000, 0xf9ca453a00000000, 0x187c17d500000000, + 0x7aa1913f00000000, 0x9b17c3d000000000, 0xff1ded3100000000, + 0x1eabbfde00000000, 0x7c76393400000000, 0x9dc06bdb00000000, + 0xf564142d00000000, 0x14d246c200000000, 0x760fc02800000000, + 0x97b992c700000000, 0xf3b3bc2600000000, 0x1205eec900000000, + 0x70d8682300000000, 0x916e3acc00000000, 0xd12ea04900000000, + 0x3098f2a600000000, 0x5245744c00000000, 0xb3f326a300000000, + 0xd7f9084200000000, 0x364f5aad00000000, 0x5492dc4700000000, + 0xb5248ea800000000, 0xdd80f15e00000000, 0x3c36a3b100000000, + 0x5eeb255b00000000, 0xbf5d77b400000000, 0xdb57595500000000, + 0x3ae10bba00000000, 0x583c8d5000000000, 0xb98adfbf00000000, + 0xc972036700000000, 0x28c4518800000000, 0x4a19d76200000000, + 0xabaf858d00000000, 0xcfa5ab6c00000000, 0x2e13f98300000000, + 0x4cce7f6900000000, 0xad782d8600000000, 0xc5dc527000000000, + 0x246a009f00000000, 0x46b7867500000000, 0xa701d49a00000000, + 0xc30bfa7b00000000, 0x22bda89400000000, 0x40602e7e00000000, + 0xa1d67c9100000000}, + {0x0000000000000000, 0x5880e2d700000000, 0xf106b47400000000, + 0xa98656a300000000, 0xe20d68e900000000, 0xba8d8a3e00000000, + 0x130bdc9d00000000, 0x4b8b3e4a00000000, 0x851da10900000000, + 0xdd9d43de00000000, 0x741b157d00000000, 0x2c9bf7aa00000000, + 0x6710c9e000000000, 0x3f902b3700000000, 0x96167d9400000000, + 0xce969f4300000000, 0x0a3b421300000000, 0x52bba0c400000000, + 0xfb3df66700000000, 0xa3bd14b000000000, 0xe8362afa00000000, + 0xb0b6c82d00000000, 0x19309e8e00000000, 0x41b07c5900000000, + 0x8f26e31a00000000, 0xd7a601cd00000000, 0x7e20576e00000000, + 0x26a0b5b900000000, 0x6d2b8bf300000000, 0x35ab692400000000, + 0x9c2d3f8700000000, 0xc4addd5000000000, 0x1476842600000000, + 0x4cf666f100000000, 0xe570305200000000, 0xbdf0d28500000000, + 0xf67beccf00000000, 0xaefb0e1800000000, 0x077d58bb00000000, + 0x5ffdba6c00000000, 0x916b252f00000000, 0xc9ebc7f800000000, + 0x606d915b00000000, 0x38ed738c00000000, 0x73664dc600000000, + 0x2be6af1100000000, 0x8260f9b200000000, 0xdae01b6500000000, + 0x1e4dc63500000000, 0x46cd24e200000000, 0xef4b724100000000, + 0xb7cb909600000000, 0xfc40aedc00000000, 0xa4c04c0b00000000, + 0x0d461aa800000000, 0x55c6f87f00000000, 0x9b50673c00000000, + 0xc3d085eb00000000, 0x6a56d34800000000, 0x32d6319f00000000, + 0x795d0fd500000000, 0x21dded0200000000, 0x885bbba100000000, + 0xd0db597600000000, 0x28ec084d00000000, 0x706cea9a00000000, + 0xd9eabc3900000000, 0x816a5eee00000000, 0xcae160a400000000, + 0x9261827300000000, 0x3be7d4d000000000, 0x6367360700000000, + 0xadf1a94400000000, 0xf5714b9300000000, 0x5cf71d3000000000, + 0x0477ffe700000000, 0x4ffcc1ad00000000, 0x177c237a00000000, + 0xbefa75d900000000, 0xe67a970e00000000, 0x22d74a5e00000000, + 0x7a57a88900000000, 0xd3d1fe2a00000000, 0x8b511cfd00000000, + 0xc0da22b700000000, 0x985ac06000000000, 0x31dc96c300000000, + 0x695c741400000000, 0xa7caeb5700000000, 0xff4a098000000000, + 0x56cc5f2300000000, 0x0e4cbdf400000000, 0x45c783be00000000, + 0x1d47616900000000, 0xb4c137ca00000000, 0xec41d51d00000000, + 0x3c9a8c6b00000000, 0x641a6ebc00000000, 0xcd9c381f00000000, + 0x951cdac800000000, 0xde97e48200000000, 0x8617065500000000, + 0x2f9150f600000000, 0x7711b22100000000, 0xb9872d6200000000, + 0xe107cfb500000000, 0x4881991600000000, 0x10017bc100000000, + 0x5b8a458b00000000, 0x030aa75c00000000, 0xaa8cf1ff00000000, + 0xf20c132800000000, 0x36a1ce7800000000, 0x6e212caf00000000, + 0xc7a77a0c00000000, 0x9f2798db00000000, 0xd4aca69100000000, + 0x8c2c444600000000, 0x25aa12e500000000, 0x7d2af03200000000, + 0xb3bc6f7100000000, 0xeb3c8da600000000, 0x42badb0500000000, + 0x1a3a39d200000000, 0x51b1079800000000, 0x0931e54f00000000, + 0xa0b7b3ec00000000, 0xf837513b00000000, 0x50d8119a00000000, + 0x0858f34d00000000, 0xa1dea5ee00000000, 0xf95e473900000000, + 0xb2d5797300000000, 0xea559ba400000000, 0x43d3cd0700000000, + 0x1b532fd000000000, 0xd5c5b09300000000, 0x8d45524400000000, + 0x24c304e700000000, 0x7c43e63000000000, 0x37c8d87a00000000, + 0x6f483aad00000000, 0xc6ce6c0e00000000, 0x9e4e8ed900000000, + 0x5ae3538900000000, 0x0263b15e00000000, 0xabe5e7fd00000000, + 0xf365052a00000000, 0xb8ee3b6000000000, 0xe06ed9b700000000, + 0x49e88f1400000000, 0x11686dc300000000, 0xdffef28000000000, + 0x877e105700000000, 0x2ef846f400000000, 0x7678a42300000000, + 0x3df39a6900000000, 0x657378be00000000, 0xccf52e1d00000000, + 0x9475ccca00000000, 0x44ae95bc00000000, 0x1c2e776b00000000, + 0xb5a821c800000000, 0xed28c31f00000000, 0xa6a3fd5500000000, + 0xfe231f8200000000, 0x57a5492100000000, 0x0f25abf600000000, + 0xc1b334b500000000, 0x9933d66200000000, 0x30b580c100000000, + 0x6835621600000000, 0x23be5c5c00000000, 0x7b3ebe8b00000000, + 0xd2b8e82800000000, 0x8a380aff00000000, 0x4e95d7af00000000, + 0x1615357800000000, 0xbf9363db00000000, 0xe713810c00000000, + 0xac98bf4600000000, 0xf4185d9100000000, 0x5d9e0b3200000000, + 0x051ee9e500000000, 0xcb8876a600000000, 0x9308947100000000, + 0x3a8ec2d200000000, 0x620e200500000000, 0x29851e4f00000000, + 0x7105fc9800000000, 0xd883aa3b00000000, 0x800348ec00000000, + 0x783419d700000000, 0x20b4fb0000000000, 0x8932ada300000000, + 0xd1b24f7400000000, 0x9a39713e00000000, 0xc2b993e900000000, + 0x6b3fc54a00000000, 0x33bf279d00000000, 0xfd29b8de00000000, + 0xa5a95a0900000000, 0x0c2f0caa00000000, 0x54afee7d00000000, + 0x1f24d03700000000, 0x47a432e000000000, 0xee22644300000000, + 0xb6a2869400000000, 0x720f5bc400000000, 0x2a8fb91300000000, + 0x8309efb000000000, 0xdb890d6700000000, 0x9002332d00000000, + 0xc882d1fa00000000, 0x6104875900000000, 0x3984658e00000000, + 0xf712facd00000000, 0xaf92181a00000000, 0x06144eb900000000, + 0x5e94ac6e00000000, 0x151f922400000000, 0x4d9f70f300000000, + 0xe419265000000000, 0xbc99c48700000000, 0x6c429df100000000, + 0x34c27f2600000000, 0x9d44298500000000, 0xc5c4cb5200000000, + 0x8e4ff51800000000, 0xd6cf17cf00000000, 0x7f49416c00000000, + 0x27c9a3bb00000000, 0xe95f3cf800000000, 0xb1dfde2f00000000, + 0x1859888c00000000, 0x40d96a5b00000000, 0x0b52541100000000, + 0x53d2b6c600000000, 0xfa54e06500000000, 0xa2d402b200000000, + 0x6679dfe200000000, 0x3ef93d3500000000, 0x977f6b9600000000, + 0xcfff894100000000, 0x8474b70b00000000, 0xdcf455dc00000000, + 0x7572037f00000000, 0x2df2e1a800000000, 0xe3647eeb00000000, + 0xbbe49c3c00000000, 0x1262ca9f00000000, 0x4ae2284800000000, + 0x0169160200000000, 0x59e9f4d500000000, 0xf06fa27600000000, + 0xa8ef40a100000000}, + {0x0000000000000000, 0x463b676500000000, 0x8c76ceca00000000, + 0xca4da9af00000000, 0x59ebed4e00000000, 0x1fd08a2b00000000, + 0xd59d238400000000, 0x93a644e100000000, 0xb2d6db9d00000000, + 0xf4edbcf800000000, 0x3ea0155700000000, 0x789b723200000000, + 0xeb3d36d300000000, 0xad0651b600000000, 0x674bf81900000000, + 0x21709f7c00000000, 0x25abc6e000000000, 0x6390a18500000000, + 0xa9dd082a00000000, 0xefe66f4f00000000, 0x7c402bae00000000, + 0x3a7b4ccb00000000, 0xf036e56400000000, 0xb60d820100000000, + 0x977d1d7d00000000, 0xd1467a1800000000, 0x1b0bd3b700000000, + 0x5d30b4d200000000, 0xce96f03300000000, 0x88ad975600000000, + 0x42e03ef900000000, 0x04db599c00000000, 0x0b50fc1a00000000, + 0x4d6b9b7f00000000, 0x872632d000000000, 0xc11d55b500000000, + 0x52bb115400000000, 0x1480763100000000, 0xdecddf9e00000000, + 0x98f6b8fb00000000, 0xb986278700000000, 0xffbd40e200000000, + 0x35f0e94d00000000, 0x73cb8e2800000000, 0xe06dcac900000000, + 0xa656adac00000000, 0x6c1b040300000000, 0x2a20636600000000, + 0x2efb3afa00000000, 0x68c05d9f00000000, 0xa28df43000000000, + 0xe4b6935500000000, 0x7710d7b400000000, 0x312bb0d100000000, + 0xfb66197e00000000, 0xbd5d7e1b00000000, 0x9c2de16700000000, + 0xda16860200000000, 0x105b2fad00000000, 0x566048c800000000, + 0xc5c60c2900000000, 0x83fd6b4c00000000, 0x49b0c2e300000000, + 0x0f8ba58600000000, 0x16a0f83500000000, 0x509b9f5000000000, + 0x9ad636ff00000000, 0xdced519a00000000, 0x4f4b157b00000000, + 0x0970721e00000000, 0xc33ddbb100000000, 0x8506bcd400000000, + 0xa47623a800000000, 0xe24d44cd00000000, 0x2800ed6200000000, + 0x6e3b8a0700000000, 0xfd9dcee600000000, 0xbba6a98300000000, + 0x71eb002c00000000, 0x37d0674900000000, 0x330b3ed500000000, + 0x753059b000000000, 0xbf7df01f00000000, 0xf946977a00000000, + 0x6ae0d39b00000000, 0x2cdbb4fe00000000, 0xe6961d5100000000, + 0xa0ad7a3400000000, 0x81dde54800000000, 0xc7e6822d00000000, + 0x0dab2b8200000000, 0x4b904ce700000000, 0xd836080600000000, + 0x9e0d6f6300000000, 0x5440c6cc00000000, 0x127ba1a900000000, + 0x1df0042f00000000, 0x5bcb634a00000000, 0x9186cae500000000, + 0xd7bdad8000000000, 0x441be96100000000, 0x02208e0400000000, + 0xc86d27ab00000000, 0x8e5640ce00000000, 0xaf26dfb200000000, + 0xe91db8d700000000, 0x2350117800000000, 0x656b761d00000000, + 0xf6cd32fc00000000, 0xb0f6559900000000, 0x7abbfc3600000000, + 0x3c809b5300000000, 0x385bc2cf00000000, 0x7e60a5aa00000000, + 0xb42d0c0500000000, 0xf2166b6000000000, 0x61b02f8100000000, + 0x278b48e400000000, 0xedc6e14b00000000, 0xabfd862e00000000, + 0x8a8d195200000000, 0xccb67e3700000000, 0x06fbd79800000000, + 0x40c0b0fd00000000, 0xd366f41c00000000, 0x955d937900000000, + 0x5f103ad600000000, 0x192b5db300000000, 0x2c40f16b00000000, + 0x6a7b960e00000000, 0xa0363fa100000000, 0xe60d58c400000000, + 0x75ab1c2500000000, 0x33907b4000000000, 0xf9ddd2ef00000000, + 0xbfe6b58a00000000, 0x9e962af600000000, 0xd8ad4d9300000000, + 0x12e0e43c00000000, 0x54db835900000000, 0xc77dc7b800000000, + 0x8146a0dd00000000, 0x4b0b097200000000, 0x0d306e1700000000, + 0x09eb378b00000000, 0x4fd050ee00000000, 0x859df94100000000, + 0xc3a69e2400000000, 0x5000dac500000000, 0x163bbda000000000, + 0xdc76140f00000000, 0x9a4d736a00000000, 0xbb3dec1600000000, + 0xfd068b7300000000, 0x374b22dc00000000, 0x717045b900000000, + 0xe2d6015800000000, 0xa4ed663d00000000, 0x6ea0cf9200000000, + 0x289ba8f700000000, 0x27100d7100000000, 0x612b6a1400000000, + 0xab66c3bb00000000, 0xed5da4de00000000, 0x7efbe03f00000000, + 0x38c0875a00000000, 0xf28d2ef500000000, 0xb4b6499000000000, + 0x95c6d6ec00000000, 0xd3fdb18900000000, 0x19b0182600000000, + 0x5f8b7f4300000000, 0xcc2d3ba200000000, 0x8a165cc700000000, + 0x405bf56800000000, 0x0660920d00000000, 0x02bbcb9100000000, + 0x4480acf400000000, 0x8ecd055b00000000, 0xc8f6623e00000000, + 0x5b5026df00000000, 0x1d6b41ba00000000, 0xd726e81500000000, + 0x911d8f7000000000, 0xb06d100c00000000, 0xf656776900000000, + 0x3c1bdec600000000, 0x7a20b9a300000000, 0xe986fd4200000000, + 0xafbd9a2700000000, 0x65f0338800000000, 0x23cb54ed00000000, + 0x3ae0095e00000000, 0x7cdb6e3b00000000, 0xb696c79400000000, + 0xf0ada0f100000000, 0x630be41000000000, 0x2530837500000000, + 0xef7d2ada00000000, 0xa9464dbf00000000, 0x8836d2c300000000, + 0xce0db5a600000000, 0x04401c0900000000, 0x427b7b6c00000000, + 0xd1dd3f8d00000000, 0x97e658e800000000, 0x5dabf14700000000, + 0x1b90962200000000, 0x1f4bcfbe00000000, 0x5970a8db00000000, + 0x933d017400000000, 0xd506661100000000, 0x46a022f000000000, + 0x009b459500000000, 0xcad6ec3a00000000, 0x8ced8b5f00000000, + 0xad9d142300000000, 0xeba6734600000000, 0x21ebdae900000000, + 0x67d0bd8c00000000, 0xf476f96d00000000, 0xb24d9e0800000000, + 0x780037a700000000, 0x3e3b50c200000000, 0x31b0f54400000000, + 0x778b922100000000, 0xbdc63b8e00000000, 0xfbfd5ceb00000000, + 0x685b180a00000000, 0x2e607f6f00000000, 0xe42dd6c000000000, + 0xa216b1a500000000, 0x83662ed900000000, 0xc55d49bc00000000, + 0x0f10e01300000000, 0x492b877600000000, 0xda8dc39700000000, + 0x9cb6a4f200000000, 0x56fb0d5d00000000, 0x10c06a3800000000, + 0x141b33a400000000, 0x522054c100000000, 0x986dfd6e00000000, + 0xde569a0b00000000, 0x4df0deea00000000, 0x0bcbb98f00000000, + 0xc186102000000000, 0x87bd774500000000, 0xa6cde83900000000, + 0xe0f68f5c00000000, 0x2abb26f300000000, 0x6c80419600000000, + 0xff26057700000000, 0xb91d621200000000, 0x7350cbbd00000000, + 0x356bacd800000000}, + {0x0000000000000000, 0x9e83da9f00000000, 0x7d01c4e400000000, + 0xe3821e7b00000000, 0xbb04f91200000000, 0x2587238d00000000, + 0xc6053df600000000, 0x5886e76900000000, 0x7609f22500000000, + 0xe88a28ba00000000, 0x0b0836c100000000, 0x958bec5e00000000, + 0xcd0d0b3700000000, 0x538ed1a800000000, 0xb00ccfd300000000, + 0x2e8f154c00000000, 0xec12e44b00000000, 0x72913ed400000000, + 0x911320af00000000, 0x0f90fa3000000000, 0x57161d5900000000, + 0xc995c7c600000000, 0x2a17d9bd00000000, 0xb494032200000000, + 0x9a1b166e00000000, 0x0498ccf100000000, 0xe71ad28a00000000, + 0x7999081500000000, 0x211fef7c00000000, 0xbf9c35e300000000, + 0x5c1e2b9800000000, 0xc29df10700000000, 0xd825c89700000000, + 0x46a6120800000000, 0xa5240c7300000000, 0x3ba7d6ec00000000, + 0x6321318500000000, 0xfda2eb1a00000000, 0x1e20f56100000000, + 0x80a32ffe00000000, 0xae2c3ab200000000, 0x30afe02d00000000, + 0xd32dfe5600000000, 0x4dae24c900000000, 0x1528c3a000000000, + 0x8bab193f00000000, 0x6829074400000000, 0xf6aadddb00000000, + 0x34372cdc00000000, 0xaab4f64300000000, 0x4936e83800000000, + 0xd7b532a700000000, 0x8f33d5ce00000000, 0x11b00f5100000000, + 0xf232112a00000000, 0x6cb1cbb500000000, 0x423edef900000000, + 0xdcbd046600000000, 0x3f3f1a1d00000000, 0xa1bcc08200000000, + 0xf93a27eb00000000, 0x67b9fd7400000000, 0x843be30f00000000, + 0x1ab8399000000000, 0xf14de1f400000000, 0x6fce3b6b00000000, + 0x8c4c251000000000, 0x12cfff8f00000000, 0x4a4918e600000000, + 0xd4cac27900000000, 0x3748dc0200000000, 0xa9cb069d00000000, + 0x874413d100000000, 0x19c7c94e00000000, 0xfa45d73500000000, + 0x64c60daa00000000, 0x3c40eac300000000, 0xa2c3305c00000000, + 0x41412e2700000000, 0xdfc2f4b800000000, 0x1d5f05bf00000000, + 0x83dcdf2000000000, 0x605ec15b00000000, 0xfedd1bc400000000, + 0xa65bfcad00000000, 0x38d8263200000000, 0xdb5a384900000000, + 0x45d9e2d600000000, 0x6b56f79a00000000, 0xf5d52d0500000000, + 0x1657337e00000000, 0x88d4e9e100000000, 0xd0520e8800000000, + 0x4ed1d41700000000, 0xad53ca6c00000000, 0x33d010f300000000, + 0x2968296300000000, 0xb7ebf3fc00000000, 0x5469ed8700000000, + 0xcaea371800000000, 0x926cd07100000000, 0x0cef0aee00000000, + 0xef6d149500000000, 0x71eece0a00000000, 0x5f61db4600000000, + 0xc1e201d900000000, 0x22601fa200000000, 0xbce3c53d00000000, + 0xe465225400000000, 0x7ae6f8cb00000000, 0x9964e6b000000000, + 0x07e73c2f00000000, 0xc57acd2800000000, 0x5bf917b700000000, + 0xb87b09cc00000000, 0x26f8d35300000000, 0x7e7e343a00000000, + 0xe0fdeea500000000, 0x037ff0de00000000, 0x9dfc2a4100000000, + 0xb3733f0d00000000, 0x2df0e59200000000, 0xce72fbe900000000, + 0x50f1217600000000, 0x0877c61f00000000, 0x96f41c8000000000, + 0x757602fb00000000, 0xebf5d86400000000, 0xa39db33200000000, + 0x3d1e69ad00000000, 0xde9c77d600000000, 0x401fad4900000000, + 0x18994a2000000000, 0x861a90bf00000000, 0x65988ec400000000, + 0xfb1b545b00000000, 0xd594411700000000, 0x4b179b8800000000, + 0xa89585f300000000, 0x36165f6c00000000, 0x6e90b80500000000, + 0xf013629a00000000, 0x13917ce100000000, 0x8d12a67e00000000, + 0x4f8f577900000000, 0xd10c8de600000000, 0x328e939d00000000, + 0xac0d490200000000, 0xf48bae6b00000000, 0x6a0874f400000000, + 0x898a6a8f00000000, 0x1709b01000000000, 0x3986a55c00000000, + 0xa7057fc300000000, 0x448761b800000000, 0xda04bb2700000000, + 0x82825c4e00000000, 0x1c0186d100000000, 0xff8398aa00000000, + 0x6100423500000000, 0x7bb87ba500000000, 0xe53ba13a00000000, + 0x06b9bf4100000000, 0x983a65de00000000, 0xc0bc82b700000000, + 0x5e3f582800000000, 0xbdbd465300000000, 0x233e9ccc00000000, + 0x0db1898000000000, 0x9332531f00000000, 0x70b04d6400000000, + 0xee3397fb00000000, 0xb6b5709200000000, 0x2836aa0d00000000, + 0xcbb4b47600000000, 0x55376ee900000000, 0x97aa9fee00000000, + 0x0929457100000000, 0xeaab5b0a00000000, 0x7428819500000000, + 0x2cae66fc00000000, 0xb22dbc6300000000, 0x51afa21800000000, + 0xcf2c788700000000, 0xe1a36dcb00000000, 0x7f20b75400000000, + 0x9ca2a92f00000000, 0x022173b000000000, 0x5aa794d900000000, + 0xc4244e4600000000, 0x27a6503d00000000, 0xb9258aa200000000, + 0x52d052c600000000, 0xcc53885900000000, 0x2fd1962200000000, + 0xb1524cbd00000000, 0xe9d4abd400000000, 0x7757714b00000000, + 0x94d56f3000000000, 0x0a56b5af00000000, 0x24d9a0e300000000, + 0xba5a7a7c00000000, 0x59d8640700000000, 0xc75bbe9800000000, + 0x9fdd59f100000000, 0x015e836e00000000, 0xe2dc9d1500000000, + 0x7c5f478a00000000, 0xbec2b68d00000000, 0x20416c1200000000, + 0xc3c3726900000000, 0x5d40a8f600000000, 0x05c64f9f00000000, + 0x9b45950000000000, 0x78c78b7b00000000, 0xe64451e400000000, + 0xc8cb44a800000000, 0x56489e3700000000, 0xb5ca804c00000000, + 0x2b495ad300000000, 0x73cfbdba00000000, 0xed4c672500000000, + 0x0ece795e00000000, 0x904da3c100000000, 0x8af59a5100000000, + 0x147640ce00000000, 0xf7f45eb500000000, 0x6977842a00000000, + 0x31f1634300000000, 0xaf72b9dc00000000, 0x4cf0a7a700000000, + 0xd2737d3800000000, 0xfcfc687400000000, 0x627fb2eb00000000, + 0x81fdac9000000000, 0x1f7e760f00000000, 0x47f8916600000000, + 0xd97b4bf900000000, 0x3af9558200000000, 0xa47a8f1d00000000, + 0x66e77e1a00000000, 0xf864a48500000000, 0x1be6bafe00000000, + 0x8565606100000000, 0xdde3870800000000, 0x43605d9700000000, + 0xa0e243ec00000000, 0x3e61997300000000, 0x10ee8c3f00000000, + 0x8e6d56a000000000, 0x6def48db00000000, 0xf36c924400000000, + 0xabea752d00000000, 0x3569afb200000000, 0xd6ebb1c900000000, + 0x48686b5600000000}, + {0x0000000000000000, 0xc064281700000000, 0x80c9502e00000000, + 0x40ad783900000000, 0x0093a15c00000000, 0xc0f7894b00000000, + 0x805af17200000000, 0x403ed96500000000, 0x002643b900000000, + 0xc0426bae00000000, 0x80ef139700000000, 0x408b3b8000000000, + 0x00b5e2e500000000, 0xc0d1caf200000000, 0x807cb2cb00000000, + 0x40189adc00000000, 0x414af7a900000000, 0x812edfbe00000000, + 0xc183a78700000000, 0x01e78f9000000000, 0x41d956f500000000, + 0x81bd7ee200000000, 0xc11006db00000000, 0x01742ecc00000000, + 0x416cb41000000000, 0x81089c0700000000, 0xc1a5e43e00000000, + 0x01c1cc2900000000, 0x41ff154c00000000, 0x819b3d5b00000000, + 0xc136456200000000, 0x01526d7500000000, 0xc3929f8800000000, + 0x03f6b79f00000000, 0x435bcfa600000000, 0x833fe7b100000000, + 0xc3013ed400000000, 0x036516c300000000, 0x43c86efa00000000, + 0x83ac46ed00000000, 0xc3b4dc3100000000, 0x03d0f42600000000, + 0x437d8c1f00000000, 0x8319a40800000000, 0xc3277d6d00000000, + 0x0343557a00000000, 0x43ee2d4300000000, 0x838a055400000000, + 0x82d8682100000000, 0x42bc403600000000, 0x0211380f00000000, + 0xc275101800000000, 0x824bc97d00000000, 0x422fe16a00000000, + 0x0282995300000000, 0xc2e6b14400000000, 0x82fe2b9800000000, + 0x429a038f00000000, 0x02377bb600000000, 0xc25353a100000000, + 0x826d8ac400000000, 0x4209a2d300000000, 0x02a4daea00000000, + 0xc2c0f2fd00000000, 0xc7234eca00000000, 0x074766dd00000000, + 0x47ea1ee400000000, 0x878e36f300000000, 0xc7b0ef9600000000, + 0x07d4c78100000000, 0x4779bfb800000000, 0x871d97af00000000, + 0xc7050d7300000000, 0x0761256400000000, 0x47cc5d5d00000000, + 0x87a8754a00000000, 0xc796ac2f00000000, 0x07f2843800000000, + 0x475ffc0100000000, 0x873bd41600000000, 0x8669b96300000000, + 0x460d917400000000, 0x06a0e94d00000000, 0xc6c4c15a00000000, + 0x86fa183f00000000, 0x469e302800000000, 0x0633481100000000, + 0xc657600600000000, 0x864ffada00000000, 0x462bd2cd00000000, + 0x0686aaf400000000, 0xc6e282e300000000, 0x86dc5b8600000000, + 0x46b8739100000000, 0x06150ba800000000, 0xc67123bf00000000, + 0x04b1d14200000000, 0xc4d5f95500000000, 0x8478816c00000000, + 0x441ca97b00000000, 0x0422701e00000000, 0xc446580900000000, + 0x84eb203000000000, 0x448f082700000000, 0x049792fb00000000, + 0xc4f3baec00000000, 0x845ec2d500000000, 0x443aeac200000000, + 0x040433a700000000, 0xc4601bb000000000, 0x84cd638900000000, + 0x44a94b9e00000000, 0x45fb26eb00000000, 0x859f0efc00000000, + 0xc53276c500000000, 0x05565ed200000000, 0x456887b700000000, + 0x850cafa000000000, 0xc5a1d79900000000, 0x05c5ff8e00000000, + 0x45dd655200000000, 0x85b94d4500000000, 0xc514357c00000000, + 0x05701d6b00000000, 0x454ec40e00000000, 0x852aec1900000000, + 0xc587942000000000, 0x05e3bc3700000000, 0xcf41ed4f00000000, + 0x0f25c55800000000, 0x4f88bd6100000000, 0x8fec957600000000, + 0xcfd24c1300000000, 0x0fb6640400000000, 0x4f1b1c3d00000000, + 0x8f7f342a00000000, 0xcf67aef600000000, 0x0f0386e100000000, + 0x4faefed800000000, 0x8fcad6cf00000000, 0xcff40faa00000000, + 0x0f9027bd00000000, 0x4f3d5f8400000000, 0x8f59779300000000, + 0x8e0b1ae600000000, 0x4e6f32f100000000, 0x0ec24ac800000000, + 0xcea662df00000000, 0x8e98bbba00000000, 0x4efc93ad00000000, + 0x0e51eb9400000000, 0xce35c38300000000, 0x8e2d595f00000000, + 0x4e49714800000000, 0x0ee4097100000000, 0xce80216600000000, + 0x8ebef80300000000, 0x4edad01400000000, 0x0e77a82d00000000, + 0xce13803a00000000, 0x0cd372c700000000, 0xccb75ad000000000, + 0x8c1a22e900000000, 0x4c7e0afe00000000, 0x0c40d39b00000000, + 0xcc24fb8c00000000, 0x8c8983b500000000, 0x4cedaba200000000, + 0x0cf5317e00000000, 0xcc91196900000000, 0x8c3c615000000000, + 0x4c58494700000000, 0x0c66902200000000, 0xcc02b83500000000, + 0x8cafc00c00000000, 0x4ccbe81b00000000, 0x4d99856e00000000, + 0x8dfdad7900000000, 0xcd50d54000000000, 0x0d34fd5700000000, + 0x4d0a243200000000, 0x8d6e0c2500000000, 0xcdc3741c00000000, + 0x0da75c0b00000000, 0x4dbfc6d700000000, 0x8ddbeec000000000, + 0xcd7696f900000000, 0x0d12beee00000000, 0x4d2c678b00000000, + 0x8d484f9c00000000, 0xcde537a500000000, 0x0d811fb200000000, + 0x0862a38500000000, 0xc8068b9200000000, 0x88abf3ab00000000, + 0x48cfdbbc00000000, 0x08f102d900000000, 0xc8952ace00000000, + 0x883852f700000000, 0x485c7ae000000000, 0x0844e03c00000000, + 0xc820c82b00000000, 0x888db01200000000, 0x48e9980500000000, + 0x08d7416000000000, 0xc8b3697700000000, 0x881e114e00000000, + 0x487a395900000000, 0x4928542c00000000, 0x894c7c3b00000000, + 0xc9e1040200000000, 0x09852c1500000000, 0x49bbf57000000000, + 0x89dfdd6700000000, 0xc972a55e00000000, 0x09168d4900000000, + 0x490e179500000000, 0x896a3f8200000000, 0xc9c747bb00000000, + 0x09a36fac00000000, 0x499db6c900000000, 0x89f99ede00000000, + 0xc954e6e700000000, 0x0930cef000000000, 0xcbf03c0d00000000, + 0x0b94141a00000000, 0x4b396c2300000000, 0x8b5d443400000000, + 0xcb639d5100000000, 0x0b07b54600000000, 0x4baacd7f00000000, + 0x8bcee56800000000, 0xcbd67fb400000000, 0x0bb257a300000000, + 0x4b1f2f9a00000000, 0x8b7b078d00000000, 0xcb45dee800000000, + 0x0b21f6ff00000000, 0x4b8c8ec600000000, 0x8be8a6d100000000, + 0x8abacba400000000, 0x4adee3b300000000, 0x0a739b8a00000000, + 0xca17b39d00000000, 0x8a296af800000000, 0x4a4d42ef00000000, + 0x0ae03ad600000000, 0xca8412c100000000, 0x8a9c881d00000000, + 0x4af8a00a00000000, 0x0a55d83300000000, 0xca31f02400000000, + 0x8a0f294100000000, 0x4a6b015600000000, 0x0ac6796f00000000, + 0xcaa2517800000000}, + {0x0000000000000000, 0xd4ea739b00000000, 0xe9d396ed00000000, + 0x3d39e57600000000, 0x93a15c0000000000, 0x474b2f9b00000000, + 0x7a72caed00000000, 0xae98b97600000000, 0x2643b90000000000, + 0xf2a9ca9b00000000, 0xcf902fed00000000, 0x1b7a5c7600000000, + 0xb5e2e50000000000, 0x6108969b00000000, 0x5c3173ed00000000, + 0x88db007600000000, 0x4c86720100000000, 0x986c019a00000000, + 0xa555e4ec00000000, 0x71bf977700000000, 0xdf272e0100000000, + 0x0bcd5d9a00000000, 0x36f4b8ec00000000, 0xe21ecb7700000000, + 0x6ac5cb0100000000, 0xbe2fb89a00000000, 0x83165dec00000000, + 0x57fc2e7700000000, 0xf964970100000000, 0x2d8ee49a00000000, + 0x10b701ec00000000, 0xc45d727700000000, 0x980ce50200000000, + 0x4ce6969900000000, 0x71df73ef00000000, 0xa535007400000000, + 0x0badb90200000000, 0xdf47ca9900000000, 0xe27e2fef00000000, + 0x36945c7400000000, 0xbe4f5c0200000000, 0x6aa52f9900000000, + 0x579ccaef00000000, 0x8376b97400000000, 0x2dee000200000000, + 0xf904739900000000, 0xc43d96ef00000000, 0x10d7e57400000000, + 0xd48a970300000000, 0x0060e49800000000, 0x3d5901ee00000000, + 0xe9b3727500000000, 0x472bcb0300000000, 0x93c1b89800000000, + 0xaef85dee00000000, 0x7a122e7500000000, 0xf2c92e0300000000, + 0x26235d9800000000, 0x1b1ab8ee00000000, 0xcff0cb7500000000, + 0x6168720300000000, 0xb582019800000000, 0x88bbe4ee00000000, + 0x5c51977500000000, 0x3019ca0500000000, 0xe4f3b99e00000000, + 0xd9ca5ce800000000, 0x0d202f7300000000, 0xa3b8960500000000, + 0x7752e59e00000000, 0x4a6b00e800000000, 0x9e81737300000000, + 0x165a730500000000, 0xc2b0009e00000000, 0xff89e5e800000000, + 0x2b63967300000000, 0x85fb2f0500000000, 0x51115c9e00000000, + 0x6c28b9e800000000, 0xb8c2ca7300000000, 0x7c9fb80400000000, + 0xa875cb9f00000000, 0x954c2ee900000000, 0x41a65d7200000000, + 0xef3ee40400000000, 0x3bd4979f00000000, 0x06ed72e900000000, + 0xd207017200000000, 0x5adc010400000000, 0x8e36729f00000000, + 0xb30f97e900000000, 0x67e5e47200000000, 0xc97d5d0400000000, + 0x1d972e9f00000000, 0x20aecbe900000000, 0xf444b87200000000, + 0xa8152f0700000000, 0x7cff5c9c00000000, 0x41c6b9ea00000000, + 0x952cca7100000000, 0x3bb4730700000000, 0xef5e009c00000000, + 0xd267e5ea00000000, 0x068d967100000000, 0x8e56960700000000, + 0x5abce59c00000000, 0x678500ea00000000, 0xb36f737100000000, + 0x1df7ca0700000000, 0xc91db99c00000000, 0xf4245cea00000000, + 0x20ce2f7100000000, 0xe4935d0600000000, 0x30792e9d00000000, + 0x0d40cbeb00000000, 0xd9aab87000000000, 0x7732010600000000, + 0xa3d8729d00000000, 0x9ee197eb00000000, 0x4a0be47000000000, + 0xc2d0e40600000000, 0x163a979d00000000, 0x2b0372eb00000000, + 0xffe9017000000000, 0x5171b80600000000, 0x859bcb9d00000000, + 0xb8a22eeb00000000, 0x6c485d7000000000, 0x6032940b00000000, + 0xb4d8e79000000000, 0x89e102e600000000, 0x5d0b717d00000000, + 0xf393c80b00000000, 0x2779bb9000000000, 0x1a405ee600000000, + 0xceaa2d7d00000000, 0x46712d0b00000000, 0x929b5e9000000000, + 0xafa2bbe600000000, 0x7b48c87d00000000, 0xd5d0710b00000000, + 0x013a029000000000, 0x3c03e7e600000000, 0xe8e9947d00000000, + 0x2cb4e60a00000000, 0xf85e959100000000, 0xc56770e700000000, + 0x118d037c00000000, 0xbf15ba0a00000000, 0x6bffc99100000000, + 0x56c62ce700000000, 0x822c5f7c00000000, 0x0af75f0a00000000, + 0xde1d2c9100000000, 0xe324c9e700000000, 0x37ceba7c00000000, + 0x9956030a00000000, 0x4dbc709100000000, 0x708595e700000000, + 0xa46fe67c00000000, 0xf83e710900000000, 0x2cd4029200000000, + 0x11ede7e400000000, 0xc507947f00000000, 0x6b9f2d0900000000, + 0xbf755e9200000000, 0x824cbbe400000000, 0x56a6c87f00000000, + 0xde7dc80900000000, 0x0a97bb9200000000, 0x37ae5ee400000000, + 0xe3442d7f00000000, 0x4ddc940900000000, 0x9936e79200000000, + 0xa40f02e400000000, 0x70e5717f00000000, 0xb4b8030800000000, + 0x6052709300000000, 0x5d6b95e500000000, 0x8981e67e00000000, + 0x27195f0800000000, 0xf3f32c9300000000, 0xcecac9e500000000, + 0x1a20ba7e00000000, 0x92fbba0800000000, 0x4611c99300000000, + 0x7b282ce500000000, 0xafc25f7e00000000, 0x015ae60800000000, + 0xd5b0959300000000, 0xe88970e500000000, 0x3c63037e00000000, + 0x502b5e0e00000000, 0x84c12d9500000000, 0xb9f8c8e300000000, + 0x6d12bb7800000000, 0xc38a020e00000000, 0x1760719500000000, + 0x2a5994e300000000, 0xfeb3e77800000000, 0x7668e70e00000000, + 0xa282949500000000, 0x9fbb71e300000000, 0x4b51027800000000, + 0xe5c9bb0e00000000, 0x3123c89500000000, 0x0c1a2de300000000, + 0xd8f05e7800000000, 0x1cad2c0f00000000, 0xc8475f9400000000, + 0xf57ebae200000000, 0x2194c97900000000, 0x8f0c700f00000000, + 0x5be6039400000000, 0x66dfe6e200000000, 0xb235957900000000, + 0x3aee950f00000000, 0xee04e69400000000, 0xd33d03e200000000, + 0x07d7707900000000, 0xa94fc90f00000000, 0x7da5ba9400000000, + 0x409c5fe200000000, 0x94762c7900000000, 0xc827bb0c00000000, + 0x1ccdc89700000000, 0x21f42de100000000, 0xf51e5e7a00000000, + 0x5b86e70c00000000, 0x8f6c949700000000, 0xb25571e100000000, + 0x66bf027a00000000, 0xee64020c00000000, 0x3a8e719700000000, + 0x07b794e100000000, 0xd35de77a00000000, 0x7dc55e0c00000000, + 0xa92f2d9700000000, 0x9416c8e100000000, 0x40fcbb7a00000000, + 0x84a1c90d00000000, 0x504bba9600000000, 0x6d725fe000000000, + 0xb9982c7b00000000, 0x1700950d00000000, 0xc3eae69600000000, + 0xfed303e000000000, 0x2a39707b00000000, 0xa2e2700d00000000, + 0x7608039600000000, 0x4b31e6e000000000, 0x9fdb957b00000000, + 0x31432c0d00000000, 0xe5a95f9600000000, 0xd890bae000000000, + 0x0c7ac97b00000000}, + {0x0000000000000000, 0x2765258100000000, 0x0fcc3bd900000000, + 0x28a91e5800000000, 0x5f9e066900000000, 0x78fb23e800000000, + 0x50523db000000000, 0x7737183100000000, 0xbe3c0dd200000000, + 0x9959285300000000, 0xb1f0360b00000000, 0x9695138a00000000, + 0xe1a20bbb00000000, 0xc6c72e3a00000000, 0xee6e306200000000, + 0xc90b15e300000000, 0x3d7f6b7f00000000, 0x1a1a4efe00000000, + 0x32b350a600000000, 0x15d6752700000000, 0x62e16d1600000000, + 0x4584489700000000, 0x6d2d56cf00000000, 0x4a48734e00000000, + 0x834366ad00000000, 0xa426432c00000000, 0x8c8f5d7400000000, + 0xabea78f500000000, 0xdcdd60c400000000, 0xfbb8454500000000, + 0xd3115b1d00000000, 0xf4747e9c00000000, 0x7afed6fe00000000, + 0x5d9bf37f00000000, 0x7532ed2700000000, 0x5257c8a600000000, + 0x2560d09700000000, 0x0205f51600000000, 0x2aaceb4e00000000, + 0x0dc9cecf00000000, 0xc4c2db2c00000000, 0xe3a7fead00000000, + 0xcb0ee0f500000000, 0xec6bc57400000000, 0x9b5cdd4500000000, + 0xbc39f8c400000000, 0x9490e69c00000000, 0xb3f5c31d00000000, + 0x4781bd8100000000, 0x60e4980000000000, 0x484d865800000000, + 0x6f28a3d900000000, 0x181fbbe800000000, 0x3f7a9e6900000000, + 0x17d3803100000000, 0x30b6a5b000000000, 0xf9bdb05300000000, + 0xded895d200000000, 0xf6718b8a00000000, 0xd114ae0b00000000, + 0xa623b63a00000000, 0x814693bb00000000, 0xa9ef8de300000000, + 0x8e8aa86200000000, 0xb5fadc2600000000, 0x929ff9a700000000, + 0xba36e7ff00000000, 0x9d53c27e00000000, 0xea64da4f00000000, + 0xcd01ffce00000000, 0xe5a8e19600000000, 0xc2cdc41700000000, + 0x0bc6d1f400000000, 0x2ca3f47500000000, 0x040aea2d00000000, + 0x236fcfac00000000, 0x5458d79d00000000, 0x733df21c00000000, + 0x5b94ec4400000000, 0x7cf1c9c500000000, 0x8885b75900000000, + 0xafe092d800000000, 0x87498c8000000000, 0xa02ca90100000000, + 0xd71bb13000000000, 0xf07e94b100000000, 0xd8d78ae900000000, + 0xffb2af6800000000, 0x36b9ba8b00000000, 0x11dc9f0a00000000, + 0x3975815200000000, 0x1e10a4d300000000, 0x6927bce200000000, + 0x4e42996300000000, 0x66eb873b00000000, 0x418ea2ba00000000, + 0xcf040ad800000000, 0xe8612f5900000000, 0xc0c8310100000000, + 0xe7ad148000000000, 0x909a0cb100000000, 0xb7ff293000000000, + 0x9f56376800000000, 0xb83312e900000000, 0x7138070a00000000, + 0x565d228b00000000, 0x7ef43cd300000000, 0x5991195200000000, + 0x2ea6016300000000, 0x09c324e200000000, 0x216a3aba00000000, + 0x060f1f3b00000000, 0xf27b61a700000000, 0xd51e442600000000, + 0xfdb75a7e00000000, 0xdad27fff00000000, 0xade567ce00000000, + 0x8a80424f00000000, 0xa2295c1700000000, 0x854c799600000000, + 0x4c476c7500000000, 0x6b2249f400000000, 0x438b57ac00000000, + 0x64ee722d00000000, 0x13d96a1c00000000, 0x34bc4f9d00000000, + 0x1c1551c500000000, 0x3b70744400000000, 0x6af5b94d00000000, + 0x4d909ccc00000000, 0x6539829400000000, 0x425ca71500000000, + 0x356bbf2400000000, 0x120e9aa500000000, 0x3aa784fd00000000, + 0x1dc2a17c00000000, 0xd4c9b49f00000000, 0xf3ac911e00000000, + 0xdb058f4600000000, 0xfc60aac700000000, 0x8b57b2f600000000, + 0xac32977700000000, 0x849b892f00000000, 0xa3feacae00000000, + 0x578ad23200000000, 0x70eff7b300000000, 0x5846e9eb00000000, + 0x7f23cc6a00000000, 0x0814d45b00000000, 0x2f71f1da00000000, + 0x07d8ef8200000000, 0x20bdca0300000000, 0xe9b6dfe000000000, + 0xced3fa6100000000, 0xe67ae43900000000, 0xc11fc1b800000000, + 0xb628d98900000000, 0x914dfc0800000000, 0xb9e4e25000000000, + 0x9e81c7d100000000, 0x100b6fb300000000, 0x376e4a3200000000, + 0x1fc7546a00000000, 0x38a271eb00000000, 0x4f9569da00000000, + 0x68f04c5b00000000, 0x4059520300000000, 0x673c778200000000, + 0xae37626100000000, 0x895247e000000000, 0xa1fb59b800000000, + 0x869e7c3900000000, 0xf1a9640800000000, 0xd6cc418900000000, + 0xfe655fd100000000, 0xd9007a5000000000, 0x2d7404cc00000000, + 0x0a11214d00000000, 0x22b83f1500000000, 0x05dd1a9400000000, + 0x72ea02a500000000, 0x558f272400000000, 0x7d26397c00000000, + 0x5a431cfd00000000, 0x9348091e00000000, 0xb42d2c9f00000000, + 0x9c8432c700000000, 0xbbe1174600000000, 0xccd60f7700000000, + 0xebb32af600000000, 0xc31a34ae00000000, 0xe47f112f00000000, + 0xdf0f656b00000000, 0xf86a40ea00000000, 0xd0c35eb200000000, + 0xf7a67b3300000000, 0x8091630200000000, 0xa7f4468300000000, + 0x8f5d58db00000000, 0xa8387d5a00000000, 0x613368b900000000, + 0x46564d3800000000, 0x6eff536000000000, 0x499a76e100000000, + 0x3ead6ed000000000, 0x19c84b5100000000, 0x3161550900000000, + 0x1604708800000000, 0xe2700e1400000000, 0xc5152b9500000000, + 0xedbc35cd00000000, 0xcad9104c00000000, 0xbdee087d00000000, + 0x9a8b2dfc00000000, 0xb22233a400000000, 0x9547162500000000, + 0x5c4c03c600000000, 0x7b29264700000000, 0x5380381f00000000, + 0x74e51d9e00000000, 0x03d205af00000000, 0x24b7202e00000000, + 0x0c1e3e7600000000, 0x2b7b1bf700000000, 0xa5f1b39500000000, + 0x8294961400000000, 0xaa3d884c00000000, 0x8d58adcd00000000, + 0xfa6fb5fc00000000, 0xdd0a907d00000000, 0xf5a38e2500000000, + 0xd2c6aba400000000, 0x1bcdbe4700000000, 0x3ca89bc600000000, + 0x1401859e00000000, 0x3364a01f00000000, 0x4453b82e00000000, + 0x63369daf00000000, 0x4b9f83f700000000, 0x6cfaa67600000000, + 0x988ed8ea00000000, 0xbfebfd6b00000000, 0x9742e33300000000, + 0xb027c6b200000000, 0xc710de8300000000, 0xe075fb0200000000, + 0xc8dce55a00000000, 0xefb9c0db00000000, 0x26b2d53800000000, + 0x01d7f0b900000000, 0x297eeee100000000, 0x0e1bcb6000000000, + 0x792cd35100000000, 0x5e49f6d000000000, 0x76e0e88800000000, + 0x5185cd0900000000}}; + +#else /* W == 4 */ + +local const z_crc_t FAR crc_braid_table[][256] = { + {0x00000000, 0x9ba54c6f, 0xec3b9e9f, 0x779ed2f0, 0x03063b7f, + 0x98a37710, 0xef3da5e0, 0x7498e98f, 0x060c76fe, 0x9da93a91, + 0xea37e861, 0x7192a40e, 0x050a4d81, 0x9eaf01ee, 0xe931d31e, + 0x72949f71, 0x0c18edfc, 0x97bda193, 0xe0237363, 0x7b863f0c, + 0x0f1ed683, 0x94bb9aec, 0xe325481c, 0x78800473, 0x0a149b02, + 0x91b1d76d, 0xe62f059d, 0x7d8a49f2, 0x0912a07d, 0x92b7ec12, + 0xe5293ee2, 0x7e8c728d, 0x1831dbf8, 0x83949797, 0xf40a4567, + 0x6faf0908, 0x1b37e087, 0x8092ace8, 0xf70c7e18, 0x6ca93277, + 0x1e3dad06, 0x8598e169, 0xf2063399, 0x69a37ff6, 0x1d3b9679, + 0x869eda16, 0xf10008e6, 0x6aa54489, 0x14293604, 0x8f8c7a6b, + 0xf812a89b, 0x63b7e4f4, 0x172f0d7b, 0x8c8a4114, 0xfb1493e4, + 0x60b1df8b, 0x122540fa, 0x89800c95, 0xfe1ede65, 0x65bb920a, + 0x11237b85, 0x8a8637ea, 0xfd18e51a, 0x66bda975, 0x3063b7f0, + 0xabc6fb9f, 0xdc58296f, 0x47fd6500, 0x33658c8f, 0xa8c0c0e0, + 0xdf5e1210, 0x44fb5e7f, 0x366fc10e, 0xadca8d61, 0xda545f91, + 0x41f113fe, 0x3569fa71, 0xaeccb61e, 0xd95264ee, 0x42f72881, + 0x3c7b5a0c, 0xa7de1663, 0xd040c493, 0x4be588fc, 0x3f7d6173, + 0xa4d82d1c, 0xd346ffec, 0x48e3b383, 0x3a772cf2, 0xa1d2609d, + 0xd64cb26d, 0x4de9fe02, 0x3971178d, 0xa2d45be2, 0xd54a8912, + 0x4eefc57d, 0x28526c08, 0xb3f72067, 0xc469f297, 0x5fccbef8, + 0x2b545777, 0xb0f11b18, 0xc76fc9e8, 0x5cca8587, 0x2e5e1af6, + 0xb5fb5699, 0xc2658469, 0x59c0c806, 0x2d582189, 0xb6fd6de6, + 0xc163bf16, 0x5ac6f379, 0x244a81f4, 0xbfefcd9b, 0xc8711f6b, + 0x53d45304, 0x274cba8b, 0xbce9f6e4, 0xcb772414, 0x50d2687b, + 0x2246f70a, 0xb9e3bb65, 0xce7d6995, 0x55d825fa, 0x2140cc75, + 0xbae5801a, 0xcd7b52ea, 0x56de1e85, 0x60c76fe0, 0xfb62238f, + 0x8cfcf17f, 0x1759bd10, 0x63c1549f, 0xf86418f0, 0x8ffaca00, + 0x145f866f, 0x66cb191e, 0xfd6e5571, 0x8af08781, 0x1155cbee, + 0x65cd2261, 0xfe686e0e, 0x89f6bcfe, 0x1253f091, 0x6cdf821c, + 0xf77ace73, 0x80e41c83, 0x1b4150ec, 0x6fd9b963, 0xf47cf50c, + 0x83e227fc, 0x18476b93, 0x6ad3f4e2, 0xf176b88d, 0x86e86a7d, + 0x1d4d2612, 0x69d5cf9d, 0xf27083f2, 0x85ee5102, 0x1e4b1d6d, + 0x78f6b418, 0xe353f877, 0x94cd2a87, 0x0f6866e8, 0x7bf08f67, + 0xe055c308, 0x97cb11f8, 0x0c6e5d97, 0x7efac2e6, 0xe55f8e89, + 0x92c15c79, 0x09641016, 0x7dfcf999, 0xe659b5f6, 0x91c76706, + 0x0a622b69, 0x74ee59e4, 0xef4b158b, 0x98d5c77b, 0x03708b14, + 0x77e8629b, 0xec4d2ef4, 0x9bd3fc04, 0x0076b06b, 0x72e22f1a, + 0xe9476375, 0x9ed9b185, 0x057cfdea, 0x71e41465, 0xea41580a, + 0x9ddf8afa, 0x067ac695, 0x50a4d810, 0xcb01947f, 0xbc9f468f, + 0x273a0ae0, 0x53a2e36f, 0xc807af00, 0xbf997df0, 0x243c319f, + 0x56a8aeee, 0xcd0de281, 0xba933071, 0x21367c1e, 0x55ae9591, + 0xce0bd9fe, 0xb9950b0e, 0x22304761, 0x5cbc35ec, 0xc7197983, + 0xb087ab73, 0x2b22e71c, 0x5fba0e93, 0xc41f42fc, 0xb381900c, + 0x2824dc63, 0x5ab04312, 0xc1150f7d, 0xb68bdd8d, 0x2d2e91e2, + 0x59b6786d, 0xc2133402, 0xb58de6f2, 0x2e28aa9d, 0x489503e8, + 0xd3304f87, 0xa4ae9d77, 0x3f0bd118, 0x4b933897, 0xd03674f8, + 0xa7a8a608, 0x3c0dea67, 0x4e997516, 0xd53c3979, 0xa2a2eb89, + 0x3907a7e6, 0x4d9f4e69, 0xd63a0206, 0xa1a4d0f6, 0x3a019c99, + 0x448dee14, 0xdf28a27b, 0xa8b6708b, 0x33133ce4, 0x478bd56b, + 0xdc2e9904, 0xabb04bf4, 0x3015079b, 0x428198ea, 0xd924d485, + 0xaeba0675, 0x351f4a1a, 0x4187a395, 0xda22effa, 0xadbc3d0a, + 0x36197165}, + {0x00000000, 0xc18edfc0, 0x586cb9c1, 0x99e26601, 0xb0d97382, + 0x7157ac42, 0xe8b5ca43, 0x293b1583, 0xbac3e145, 0x7b4d3e85, + 0xe2af5884, 0x23218744, 0x0a1a92c7, 0xcb944d07, 0x52762b06, + 0x93f8f4c6, 0xaef6c4cb, 0x6f781b0b, 0xf69a7d0a, 0x3714a2ca, + 0x1e2fb749, 0xdfa16889, 0x46430e88, 0x87cdd148, 0x1435258e, + 0xd5bbfa4e, 0x4c599c4f, 0x8dd7438f, 0xa4ec560c, 0x656289cc, + 0xfc80efcd, 0x3d0e300d, 0x869c8fd7, 0x47125017, 0xdef03616, + 0x1f7ee9d6, 0x3645fc55, 0xf7cb2395, 0x6e294594, 0xafa79a54, + 0x3c5f6e92, 0xfdd1b152, 0x6433d753, 0xa5bd0893, 0x8c861d10, + 0x4d08c2d0, 0xd4eaa4d1, 0x15647b11, 0x286a4b1c, 0xe9e494dc, + 0x7006f2dd, 0xb1882d1d, 0x98b3389e, 0x593de75e, 0xc0df815f, + 0x01515e9f, 0x92a9aa59, 0x53277599, 0xcac51398, 0x0b4bcc58, + 0x2270d9db, 0xe3fe061b, 0x7a1c601a, 0xbb92bfda, 0xd64819ef, + 0x17c6c62f, 0x8e24a02e, 0x4faa7fee, 0x66916a6d, 0xa71fb5ad, + 0x3efdd3ac, 0xff730c6c, 0x6c8bf8aa, 0xad05276a, 0x34e7416b, + 0xf5699eab, 0xdc528b28, 0x1ddc54e8, 0x843e32e9, 0x45b0ed29, + 0x78bedd24, 0xb93002e4, 0x20d264e5, 0xe15cbb25, 0xc867aea6, + 0x09e97166, 0x900b1767, 0x5185c8a7, 0xc27d3c61, 0x03f3e3a1, + 0x9a1185a0, 0x5b9f5a60, 0x72a44fe3, 0xb32a9023, 0x2ac8f622, + 0xeb4629e2, 0x50d49638, 0x915a49f8, 0x08b82ff9, 0xc936f039, + 0xe00de5ba, 0x21833a7a, 0xb8615c7b, 0x79ef83bb, 0xea17777d, + 0x2b99a8bd, 0xb27bcebc, 0x73f5117c, 0x5ace04ff, 0x9b40db3f, + 0x02a2bd3e, 0xc32c62fe, 0xfe2252f3, 0x3fac8d33, 0xa64eeb32, + 0x67c034f2, 0x4efb2171, 0x8f75feb1, 0x169798b0, 0xd7194770, + 0x44e1b3b6, 0x856f6c76, 0x1c8d0a77, 0xdd03d5b7, 0xf438c034, + 0x35b61ff4, 0xac5479f5, 0x6ddaa635, 0x77e1359f, 0xb66fea5f, + 0x2f8d8c5e, 0xee03539e, 0xc738461d, 0x06b699dd, 0x9f54ffdc, + 0x5eda201c, 0xcd22d4da, 0x0cac0b1a, 0x954e6d1b, 0x54c0b2db, + 0x7dfba758, 0xbc757898, 0x25971e99, 0xe419c159, 0xd917f154, + 0x18992e94, 0x817b4895, 0x40f59755, 0x69ce82d6, 0xa8405d16, + 0x31a23b17, 0xf02ce4d7, 0x63d41011, 0xa25acfd1, 0x3bb8a9d0, + 0xfa367610, 0xd30d6393, 0x1283bc53, 0x8b61da52, 0x4aef0592, + 0xf17dba48, 0x30f36588, 0xa9110389, 0x689fdc49, 0x41a4c9ca, + 0x802a160a, 0x19c8700b, 0xd846afcb, 0x4bbe5b0d, 0x8a3084cd, + 0x13d2e2cc, 0xd25c3d0c, 0xfb67288f, 0x3ae9f74f, 0xa30b914e, + 0x62854e8e, 0x5f8b7e83, 0x9e05a143, 0x07e7c742, 0xc6691882, + 0xef520d01, 0x2edcd2c1, 0xb73eb4c0, 0x76b06b00, 0xe5489fc6, + 0x24c64006, 0xbd242607, 0x7caaf9c7, 0x5591ec44, 0x941f3384, + 0x0dfd5585, 0xcc738a45, 0xa1a92c70, 0x6027f3b0, 0xf9c595b1, + 0x384b4a71, 0x11705ff2, 0xd0fe8032, 0x491ce633, 0x889239f3, + 0x1b6acd35, 0xdae412f5, 0x430674f4, 0x8288ab34, 0xabb3beb7, + 0x6a3d6177, 0xf3df0776, 0x3251d8b6, 0x0f5fe8bb, 0xced1377b, + 0x5733517a, 0x96bd8eba, 0xbf869b39, 0x7e0844f9, 0xe7ea22f8, + 0x2664fd38, 0xb59c09fe, 0x7412d63e, 0xedf0b03f, 0x2c7e6fff, + 0x05457a7c, 0xc4cba5bc, 0x5d29c3bd, 0x9ca71c7d, 0x2735a3a7, + 0xe6bb7c67, 0x7f591a66, 0xbed7c5a6, 0x97ecd025, 0x56620fe5, + 0xcf8069e4, 0x0e0eb624, 0x9df642e2, 0x5c789d22, 0xc59afb23, + 0x041424e3, 0x2d2f3160, 0xeca1eea0, 0x754388a1, 0xb4cd5761, + 0x89c3676c, 0x484db8ac, 0xd1afdead, 0x1021016d, 0x391a14ee, + 0xf894cb2e, 0x6176ad2f, 0xa0f872ef, 0x33008629, 0xf28e59e9, + 0x6b6c3fe8, 0xaae2e028, 0x83d9f5ab, 0x42572a6b, 0xdbb54c6a, + 0x1a3b93aa}, + {0x00000000, 0xefc26b3e, 0x04f5d03d, 0xeb37bb03, 0x09eba07a, + 0xe629cb44, 0x0d1e7047, 0xe2dc1b79, 0x13d740f4, 0xfc152bca, + 0x172290c9, 0xf8e0fbf7, 0x1a3ce08e, 0xf5fe8bb0, 0x1ec930b3, + 0xf10b5b8d, 0x27ae81e8, 0xc86cead6, 0x235b51d5, 0xcc993aeb, + 0x2e452192, 0xc1874aac, 0x2ab0f1af, 0xc5729a91, 0x3479c11c, + 0xdbbbaa22, 0x308c1121, 0xdf4e7a1f, 0x3d926166, 0xd2500a58, + 0x3967b15b, 0xd6a5da65, 0x4f5d03d0, 0xa09f68ee, 0x4ba8d3ed, + 0xa46ab8d3, 0x46b6a3aa, 0xa974c894, 0x42437397, 0xad8118a9, + 0x5c8a4324, 0xb348281a, 0x587f9319, 0xb7bdf827, 0x5561e35e, + 0xbaa38860, 0x51943363, 0xbe56585d, 0x68f38238, 0x8731e906, + 0x6c065205, 0x83c4393b, 0x61182242, 0x8eda497c, 0x65edf27f, + 0x8a2f9941, 0x7b24c2cc, 0x94e6a9f2, 0x7fd112f1, 0x901379cf, + 0x72cf62b6, 0x9d0d0988, 0x763ab28b, 0x99f8d9b5, 0x9eba07a0, + 0x71786c9e, 0x9a4fd79d, 0x758dbca3, 0x9751a7da, 0x7893cce4, + 0x93a477e7, 0x7c661cd9, 0x8d6d4754, 0x62af2c6a, 0x89989769, + 0x665afc57, 0x8486e72e, 0x6b448c10, 0x80733713, 0x6fb15c2d, + 0xb9148648, 0x56d6ed76, 0xbde15675, 0x52233d4b, 0xb0ff2632, + 0x5f3d4d0c, 0xb40af60f, 0x5bc89d31, 0xaac3c6bc, 0x4501ad82, + 0xae361681, 0x41f47dbf, 0xa32866c6, 0x4cea0df8, 0xa7ddb6fb, + 0x481fddc5, 0xd1e70470, 0x3e256f4e, 0xd512d44d, 0x3ad0bf73, + 0xd80ca40a, 0x37cecf34, 0xdcf97437, 0x333b1f09, 0xc2304484, + 0x2df22fba, 0xc6c594b9, 0x2907ff87, 0xcbdbe4fe, 0x24198fc0, + 0xcf2e34c3, 0x20ec5ffd, 0xf6498598, 0x198beea6, 0xf2bc55a5, + 0x1d7e3e9b, 0xffa225e2, 0x10604edc, 0xfb57f5df, 0x14959ee1, + 0xe59ec56c, 0x0a5cae52, 0xe16b1551, 0x0ea97e6f, 0xec756516, + 0x03b70e28, 0xe880b52b, 0x0742de15, 0xe6050901, 0x09c7623f, + 0xe2f0d93c, 0x0d32b202, 0xefeea97b, 0x002cc245, 0xeb1b7946, + 0x04d91278, 0xf5d249f5, 0x1a1022cb, 0xf12799c8, 0x1ee5f2f6, + 0xfc39e98f, 0x13fb82b1, 0xf8cc39b2, 0x170e528c, 0xc1ab88e9, + 0x2e69e3d7, 0xc55e58d4, 0x2a9c33ea, 0xc8402893, 0x278243ad, + 0xccb5f8ae, 0x23779390, 0xd27cc81d, 0x3dbea323, 0xd6891820, + 0x394b731e, 0xdb976867, 0x34550359, 0xdf62b85a, 0x30a0d364, + 0xa9580ad1, 0x469a61ef, 0xadaddaec, 0x426fb1d2, 0xa0b3aaab, + 0x4f71c195, 0xa4467a96, 0x4b8411a8, 0xba8f4a25, 0x554d211b, + 0xbe7a9a18, 0x51b8f126, 0xb364ea5f, 0x5ca68161, 0xb7913a62, + 0x5853515c, 0x8ef68b39, 0x6134e007, 0x8a035b04, 0x65c1303a, + 0x871d2b43, 0x68df407d, 0x83e8fb7e, 0x6c2a9040, 0x9d21cbcd, + 0x72e3a0f3, 0x99d41bf0, 0x761670ce, 0x94ca6bb7, 0x7b080089, + 0x903fbb8a, 0x7ffdd0b4, 0x78bf0ea1, 0x977d659f, 0x7c4ade9c, + 0x9388b5a2, 0x7154aedb, 0x9e96c5e5, 0x75a17ee6, 0x9a6315d8, + 0x6b684e55, 0x84aa256b, 0x6f9d9e68, 0x805ff556, 0x6283ee2f, + 0x8d418511, 0x66763e12, 0x89b4552c, 0x5f118f49, 0xb0d3e477, + 0x5be45f74, 0xb426344a, 0x56fa2f33, 0xb938440d, 0x520fff0e, + 0xbdcd9430, 0x4cc6cfbd, 0xa304a483, 0x48331f80, 0xa7f174be, + 0x452d6fc7, 0xaaef04f9, 0x41d8bffa, 0xae1ad4c4, 0x37e20d71, + 0xd820664f, 0x3317dd4c, 0xdcd5b672, 0x3e09ad0b, 0xd1cbc635, + 0x3afc7d36, 0xd53e1608, 0x24354d85, 0xcbf726bb, 0x20c09db8, + 0xcf02f686, 0x2ddeedff, 0xc21c86c1, 0x292b3dc2, 0xc6e956fc, + 0x104c8c99, 0xff8ee7a7, 0x14b95ca4, 0xfb7b379a, 0x19a72ce3, + 0xf66547dd, 0x1d52fcde, 0xf29097e0, 0x039bcc6d, 0xec59a753, + 0x076e1c50, 0xe8ac776e, 0x0a706c17, 0xe5b20729, 0x0e85bc2a, + 0xe147d714}, + {0x00000000, 0x177b1443, 0x2ef62886, 0x398d3cc5, 0x5dec510c, + 0x4a97454f, 0x731a798a, 0x64616dc9, 0xbbd8a218, 0xaca3b65b, + 0x952e8a9e, 0x82559edd, 0xe634f314, 0xf14fe757, 0xc8c2db92, + 0xdfb9cfd1, 0xacc04271, 0xbbbb5632, 0x82366af7, 0x954d7eb4, + 0xf12c137d, 0xe657073e, 0xdfda3bfb, 0xc8a12fb8, 0x1718e069, + 0x0063f42a, 0x39eec8ef, 0x2e95dcac, 0x4af4b165, 0x5d8fa526, + 0x640299e3, 0x73798da0, 0x82f182a3, 0x958a96e0, 0xac07aa25, + 0xbb7cbe66, 0xdf1dd3af, 0xc866c7ec, 0xf1ebfb29, 0xe690ef6a, + 0x392920bb, 0x2e5234f8, 0x17df083d, 0x00a41c7e, 0x64c571b7, + 0x73be65f4, 0x4a335931, 0x5d484d72, 0x2e31c0d2, 0x394ad491, + 0x00c7e854, 0x17bcfc17, 0x73dd91de, 0x64a6859d, 0x5d2bb958, + 0x4a50ad1b, 0x95e962ca, 0x82927689, 0xbb1f4a4c, 0xac645e0f, + 0xc80533c6, 0xdf7e2785, 0xe6f31b40, 0xf1880f03, 0xde920307, + 0xc9e91744, 0xf0642b81, 0xe71f3fc2, 0x837e520b, 0x94054648, + 0xad887a8d, 0xbaf36ece, 0x654aa11f, 0x7231b55c, 0x4bbc8999, + 0x5cc79dda, 0x38a6f013, 0x2fdde450, 0x1650d895, 0x012bccd6, + 0x72524176, 0x65295535, 0x5ca469f0, 0x4bdf7db3, 0x2fbe107a, + 0x38c50439, 0x014838fc, 0x16332cbf, 0xc98ae36e, 0xdef1f72d, + 0xe77ccbe8, 0xf007dfab, 0x9466b262, 0x831da621, 0xba909ae4, + 0xadeb8ea7, 0x5c6381a4, 0x4b1895e7, 0x7295a922, 0x65eebd61, + 0x018fd0a8, 0x16f4c4eb, 0x2f79f82e, 0x3802ec6d, 0xe7bb23bc, + 0xf0c037ff, 0xc94d0b3a, 0xde361f79, 0xba5772b0, 0xad2c66f3, + 0x94a15a36, 0x83da4e75, 0xf0a3c3d5, 0xe7d8d796, 0xde55eb53, + 0xc92eff10, 0xad4f92d9, 0xba34869a, 0x83b9ba5f, 0x94c2ae1c, + 0x4b7b61cd, 0x5c00758e, 0x658d494b, 0x72f65d08, 0x169730c1, + 0x01ec2482, 0x38611847, 0x2f1a0c04, 0x6655004f, 0x712e140c, + 0x48a328c9, 0x5fd83c8a, 0x3bb95143, 0x2cc24500, 0x154f79c5, + 0x02346d86, 0xdd8da257, 0xcaf6b614, 0xf37b8ad1, 0xe4009e92, + 0x8061f35b, 0x971ae718, 0xae97dbdd, 0xb9eccf9e, 0xca95423e, + 0xddee567d, 0xe4636ab8, 0xf3187efb, 0x97791332, 0x80020771, + 0xb98f3bb4, 0xaef42ff7, 0x714de026, 0x6636f465, 0x5fbbc8a0, + 0x48c0dce3, 0x2ca1b12a, 0x3bdaa569, 0x025799ac, 0x152c8def, + 0xe4a482ec, 0xf3df96af, 0xca52aa6a, 0xdd29be29, 0xb948d3e0, + 0xae33c7a3, 0x97befb66, 0x80c5ef25, 0x5f7c20f4, 0x480734b7, + 0x718a0872, 0x66f11c31, 0x029071f8, 0x15eb65bb, 0x2c66597e, + 0x3b1d4d3d, 0x4864c09d, 0x5f1fd4de, 0x6692e81b, 0x71e9fc58, + 0x15889191, 0x02f385d2, 0x3b7eb917, 0x2c05ad54, 0xf3bc6285, + 0xe4c776c6, 0xdd4a4a03, 0xca315e40, 0xae503389, 0xb92b27ca, + 0x80a61b0f, 0x97dd0f4c, 0xb8c70348, 0xafbc170b, 0x96312bce, + 0x814a3f8d, 0xe52b5244, 0xf2504607, 0xcbdd7ac2, 0xdca66e81, + 0x031fa150, 0x1464b513, 0x2de989d6, 0x3a929d95, 0x5ef3f05c, + 0x4988e41f, 0x7005d8da, 0x677ecc99, 0x14074139, 0x037c557a, + 0x3af169bf, 0x2d8a7dfc, 0x49eb1035, 0x5e900476, 0x671d38b3, + 0x70662cf0, 0xafdfe321, 0xb8a4f762, 0x8129cba7, 0x9652dfe4, + 0xf233b22d, 0xe548a66e, 0xdcc59aab, 0xcbbe8ee8, 0x3a3681eb, + 0x2d4d95a8, 0x14c0a96d, 0x03bbbd2e, 0x67dad0e7, 0x70a1c4a4, + 0x492cf861, 0x5e57ec22, 0x81ee23f3, 0x969537b0, 0xaf180b75, + 0xb8631f36, 0xdc0272ff, 0xcb7966bc, 0xf2f45a79, 0xe58f4e3a, + 0x96f6c39a, 0x818dd7d9, 0xb800eb1c, 0xaf7bff5f, 0xcb1a9296, + 0xdc6186d5, 0xe5ecba10, 0xf297ae53, 0x2d2e6182, 0x3a5575c1, + 0x03d84904, 0x14a35d47, 0x70c2308e, 0x67b924cd, 0x5e341808, + 0x494f0c4b}}; + +local const z_word_t FAR crc_braid_big_table[][256] = { + {0x00000000, 0x43147b17, 0x8628f62e, 0xc53c8d39, 0x0c51ec5d, + 0x4f45974a, 0x8a791a73, 0xc96d6164, 0x18a2d8bb, 0x5bb6a3ac, + 0x9e8a2e95, 0xdd9e5582, 0x14f334e6, 0x57e74ff1, 0x92dbc2c8, + 0xd1cfb9df, 0x7142c0ac, 0x3256bbbb, 0xf76a3682, 0xb47e4d95, + 0x7d132cf1, 0x3e0757e6, 0xfb3bdadf, 0xb82fa1c8, 0x69e01817, + 0x2af46300, 0xefc8ee39, 0xacdc952e, 0x65b1f44a, 0x26a58f5d, + 0xe3990264, 0xa08d7973, 0xa382f182, 0xe0968a95, 0x25aa07ac, + 0x66be7cbb, 0xafd31ddf, 0xecc766c8, 0x29fbebf1, 0x6aef90e6, + 0xbb202939, 0xf834522e, 0x3d08df17, 0x7e1ca400, 0xb771c564, + 0xf465be73, 0x3159334a, 0x724d485d, 0xd2c0312e, 0x91d44a39, + 0x54e8c700, 0x17fcbc17, 0xde91dd73, 0x9d85a664, 0x58b92b5d, + 0x1bad504a, 0xca62e995, 0x89769282, 0x4c4a1fbb, 0x0f5e64ac, + 0xc63305c8, 0x85277edf, 0x401bf3e6, 0x030f88f1, 0x070392de, + 0x4417e9c9, 0x812b64f0, 0xc23f1fe7, 0x0b527e83, 0x48460594, + 0x8d7a88ad, 0xce6ef3ba, 0x1fa14a65, 0x5cb53172, 0x9989bc4b, + 0xda9dc75c, 0x13f0a638, 0x50e4dd2f, 0x95d85016, 0xd6cc2b01, + 0x76415272, 0x35552965, 0xf069a45c, 0xb37ddf4b, 0x7a10be2f, + 0x3904c538, 0xfc384801, 0xbf2c3316, 0x6ee38ac9, 0x2df7f1de, + 0xe8cb7ce7, 0xabdf07f0, 0x62b26694, 0x21a61d83, 0xe49a90ba, + 0xa78eebad, 0xa481635c, 0xe795184b, 0x22a99572, 0x61bdee65, + 0xa8d08f01, 0xebc4f416, 0x2ef8792f, 0x6dec0238, 0xbc23bbe7, + 0xff37c0f0, 0x3a0b4dc9, 0x791f36de, 0xb07257ba, 0xf3662cad, + 0x365aa194, 0x754eda83, 0xd5c3a3f0, 0x96d7d8e7, 0x53eb55de, + 0x10ff2ec9, 0xd9924fad, 0x9a8634ba, 0x5fbab983, 0x1caec294, + 0xcd617b4b, 0x8e75005c, 0x4b498d65, 0x085df672, 0xc1309716, + 0x8224ec01, 0x47186138, 0x040c1a2f, 0x4f005566, 0x0c142e71, + 0xc928a348, 0x8a3cd85f, 0x4351b93b, 0x0045c22c, 0xc5794f15, + 0x866d3402, 0x57a28ddd, 0x14b6f6ca, 0xd18a7bf3, 0x929e00e4, + 0x5bf36180, 0x18e71a97, 0xdddb97ae, 0x9ecfecb9, 0x3e4295ca, + 0x7d56eedd, 0xb86a63e4, 0xfb7e18f3, 0x32137997, 0x71070280, + 0xb43b8fb9, 0xf72ff4ae, 0x26e04d71, 0x65f43666, 0xa0c8bb5f, + 0xe3dcc048, 0x2ab1a12c, 0x69a5da3b, 0xac995702, 0xef8d2c15, + 0xec82a4e4, 0xaf96dff3, 0x6aaa52ca, 0x29be29dd, 0xe0d348b9, + 0xa3c733ae, 0x66fbbe97, 0x25efc580, 0xf4207c5f, 0xb7340748, + 0x72088a71, 0x311cf166, 0xf8719002, 0xbb65eb15, 0x7e59662c, + 0x3d4d1d3b, 0x9dc06448, 0xded41f5f, 0x1be89266, 0x58fce971, + 0x91918815, 0xd285f302, 0x17b97e3b, 0x54ad052c, 0x8562bcf3, + 0xc676c7e4, 0x034a4add, 0x405e31ca, 0x893350ae, 0xca272bb9, + 0x0f1ba680, 0x4c0fdd97, 0x4803c7b8, 0x0b17bcaf, 0xce2b3196, + 0x8d3f4a81, 0x44522be5, 0x074650f2, 0xc27addcb, 0x816ea6dc, + 0x50a11f03, 0x13b56414, 0xd689e92d, 0x959d923a, 0x5cf0f35e, + 0x1fe48849, 0xdad80570, 0x99cc7e67, 0x39410714, 0x7a557c03, + 0xbf69f13a, 0xfc7d8a2d, 0x3510eb49, 0x7604905e, 0xb3381d67, + 0xf02c6670, 0x21e3dfaf, 0x62f7a4b8, 0xa7cb2981, 0xe4df5296, + 0x2db233f2, 0x6ea648e5, 0xab9ac5dc, 0xe88ebecb, 0xeb81363a, + 0xa8954d2d, 0x6da9c014, 0x2ebdbb03, 0xe7d0da67, 0xa4c4a170, + 0x61f82c49, 0x22ec575e, 0xf323ee81, 0xb0379596, 0x750b18af, + 0x361f63b8, 0xff7202dc, 0xbc6679cb, 0x795af4f2, 0x3a4e8fe5, + 0x9ac3f696, 0xd9d78d81, 0x1ceb00b8, 0x5fff7baf, 0x96921acb, + 0xd58661dc, 0x10baece5, 0x53ae97f2, 0x82612e2d, 0xc175553a, + 0x0449d803, 0x475da314, 0x8e30c270, 0xcd24b967, 0x0818345e, + 0x4b0c4f49}, + {0x00000000, 0x3e6bc2ef, 0x3dd0f504, 0x03bb37eb, 0x7aa0eb09, + 0x44cb29e6, 0x47701e0d, 0x791bdce2, 0xf440d713, 0xca2b15fc, + 0xc9902217, 0xf7fbe0f8, 0x8ee03c1a, 0xb08bfef5, 0xb330c91e, + 0x8d5b0bf1, 0xe881ae27, 0xd6ea6cc8, 0xd5515b23, 0xeb3a99cc, + 0x9221452e, 0xac4a87c1, 0xaff1b02a, 0x919a72c5, 0x1cc17934, + 0x22aabbdb, 0x21118c30, 0x1f7a4edf, 0x6661923d, 0x580a50d2, + 0x5bb16739, 0x65daa5d6, 0xd0035d4f, 0xee689fa0, 0xedd3a84b, + 0xd3b86aa4, 0xaaa3b646, 0x94c874a9, 0x97734342, 0xa91881ad, + 0x24438a5c, 0x1a2848b3, 0x19937f58, 0x27f8bdb7, 0x5ee36155, + 0x6088a3ba, 0x63339451, 0x5d5856be, 0x3882f368, 0x06e93187, + 0x0552066c, 0x3b39c483, 0x42221861, 0x7c49da8e, 0x7ff2ed65, + 0x41992f8a, 0xccc2247b, 0xf2a9e694, 0xf112d17f, 0xcf791390, + 0xb662cf72, 0x88090d9d, 0x8bb23a76, 0xb5d9f899, 0xa007ba9e, + 0x9e6c7871, 0x9dd74f9a, 0xa3bc8d75, 0xdaa75197, 0xe4cc9378, + 0xe777a493, 0xd91c667c, 0x54476d8d, 0x6a2caf62, 0x69979889, + 0x57fc5a66, 0x2ee78684, 0x108c446b, 0x13377380, 0x2d5cb16f, + 0x488614b9, 0x76edd656, 0x7556e1bd, 0x4b3d2352, 0x3226ffb0, + 0x0c4d3d5f, 0x0ff60ab4, 0x319dc85b, 0xbcc6c3aa, 0x82ad0145, + 0x811636ae, 0xbf7df441, 0xc66628a3, 0xf80dea4c, 0xfbb6dda7, + 0xc5dd1f48, 0x7004e7d1, 0x4e6f253e, 0x4dd412d5, 0x73bfd03a, + 0x0aa40cd8, 0x34cfce37, 0x3774f9dc, 0x091f3b33, 0x844430c2, + 0xba2ff22d, 0xb994c5c6, 0x87ff0729, 0xfee4dbcb, 0xc08f1924, + 0xc3342ecf, 0xfd5fec20, 0x988549f6, 0xa6ee8b19, 0xa555bcf2, + 0x9b3e7e1d, 0xe225a2ff, 0xdc4e6010, 0xdff557fb, 0xe19e9514, + 0x6cc59ee5, 0x52ae5c0a, 0x51156be1, 0x6f7ea90e, 0x166575ec, + 0x280eb703, 0x2bb580e8, 0x15de4207, 0x010905e6, 0x3f62c709, + 0x3cd9f0e2, 0x02b2320d, 0x7ba9eeef, 0x45c22c00, 0x46791beb, + 0x7812d904, 0xf549d2f5, 0xcb22101a, 0xc89927f1, 0xf6f2e51e, + 0x8fe939fc, 0xb182fb13, 0xb239ccf8, 0x8c520e17, 0xe988abc1, + 0xd7e3692e, 0xd4585ec5, 0xea339c2a, 0x932840c8, 0xad438227, + 0xaef8b5cc, 0x90937723, 0x1dc87cd2, 0x23a3be3d, 0x201889d6, + 0x1e734b39, 0x676897db, 0x59035534, 0x5ab862df, 0x64d3a030, + 0xd10a58a9, 0xef619a46, 0xecdaadad, 0xd2b16f42, 0xabaab3a0, + 0x95c1714f, 0x967a46a4, 0xa811844b, 0x254a8fba, 0x1b214d55, + 0x189a7abe, 0x26f1b851, 0x5fea64b3, 0x6181a65c, 0x623a91b7, + 0x5c515358, 0x398bf68e, 0x07e03461, 0x045b038a, 0x3a30c165, + 0x432b1d87, 0x7d40df68, 0x7efbe883, 0x40902a6c, 0xcdcb219d, + 0xf3a0e372, 0xf01bd499, 0xce701676, 0xb76bca94, 0x8900087b, + 0x8abb3f90, 0xb4d0fd7f, 0xa10ebf78, 0x9f657d97, 0x9cde4a7c, + 0xa2b58893, 0xdbae5471, 0xe5c5969e, 0xe67ea175, 0xd815639a, + 0x554e686b, 0x6b25aa84, 0x689e9d6f, 0x56f55f80, 0x2fee8362, + 0x1185418d, 0x123e7666, 0x2c55b489, 0x498f115f, 0x77e4d3b0, + 0x745fe45b, 0x4a3426b4, 0x332ffa56, 0x0d4438b9, 0x0eff0f52, + 0x3094cdbd, 0xbdcfc64c, 0x83a404a3, 0x801f3348, 0xbe74f1a7, + 0xc76f2d45, 0xf904efaa, 0xfabfd841, 0xc4d41aae, 0x710de237, + 0x4f6620d8, 0x4cdd1733, 0x72b6d5dc, 0x0bad093e, 0x35c6cbd1, + 0x367dfc3a, 0x08163ed5, 0x854d3524, 0xbb26f7cb, 0xb89dc020, + 0x86f602cf, 0xffedde2d, 0xc1861cc2, 0xc23d2b29, 0xfc56e9c6, + 0x998c4c10, 0xa7e78eff, 0xa45cb914, 0x9a377bfb, 0xe32ca719, + 0xdd4765f6, 0xdefc521d, 0xe09790f2, 0x6dcc9b03, 0x53a759ec, + 0x501c6e07, 0x6e77ace8, 0x176c700a, 0x2907b2e5, 0x2abc850e, + 0x14d747e1}, + {0x00000000, 0xc0df8ec1, 0xc1b96c58, 0x0166e299, 0x8273d9b0, + 0x42ac5771, 0x43cab5e8, 0x83153b29, 0x45e1c3ba, 0x853e4d7b, + 0x8458afe2, 0x44872123, 0xc7921a0a, 0x074d94cb, 0x062b7652, + 0xc6f4f893, 0xcbc4f6ae, 0x0b1b786f, 0x0a7d9af6, 0xcaa21437, + 0x49b72f1e, 0x8968a1df, 0x880e4346, 0x48d1cd87, 0x8e253514, + 0x4efabbd5, 0x4f9c594c, 0x8f43d78d, 0x0c56eca4, 0xcc896265, + 0xcdef80fc, 0x0d300e3d, 0xd78f9c86, 0x17501247, 0x1636f0de, + 0xd6e97e1f, 0x55fc4536, 0x9523cbf7, 0x9445296e, 0x549aa7af, + 0x926e5f3c, 0x52b1d1fd, 0x53d73364, 0x9308bda5, 0x101d868c, + 0xd0c2084d, 0xd1a4ead4, 0x117b6415, 0x1c4b6a28, 0xdc94e4e9, + 0xddf20670, 0x1d2d88b1, 0x9e38b398, 0x5ee73d59, 0x5f81dfc0, + 0x9f5e5101, 0x59aaa992, 0x99752753, 0x9813c5ca, 0x58cc4b0b, + 0xdbd97022, 0x1b06fee3, 0x1a601c7a, 0xdabf92bb, 0xef1948d6, + 0x2fc6c617, 0x2ea0248e, 0xee7faa4f, 0x6d6a9166, 0xadb51fa7, + 0xacd3fd3e, 0x6c0c73ff, 0xaaf88b6c, 0x6a2705ad, 0x6b41e734, + 0xab9e69f5, 0x288b52dc, 0xe854dc1d, 0xe9323e84, 0x29edb045, + 0x24ddbe78, 0xe40230b9, 0xe564d220, 0x25bb5ce1, 0xa6ae67c8, + 0x6671e909, 0x67170b90, 0xa7c88551, 0x613c7dc2, 0xa1e3f303, + 0xa085119a, 0x605a9f5b, 0xe34fa472, 0x23902ab3, 0x22f6c82a, + 0xe22946eb, 0x3896d450, 0xf8495a91, 0xf92fb808, 0x39f036c9, + 0xbae50de0, 0x7a3a8321, 0x7b5c61b8, 0xbb83ef79, 0x7d7717ea, + 0xbda8992b, 0xbcce7bb2, 0x7c11f573, 0xff04ce5a, 0x3fdb409b, + 0x3ebda202, 0xfe622cc3, 0xf35222fe, 0x338dac3f, 0x32eb4ea6, + 0xf234c067, 0x7121fb4e, 0xb1fe758f, 0xb0989716, 0x704719d7, + 0xb6b3e144, 0x766c6f85, 0x770a8d1c, 0xb7d503dd, 0x34c038f4, + 0xf41fb635, 0xf57954ac, 0x35a6da6d, 0x9f35e177, 0x5fea6fb6, + 0x5e8c8d2f, 0x9e5303ee, 0x1d4638c7, 0xdd99b606, 0xdcff549f, + 0x1c20da5e, 0xdad422cd, 0x1a0bac0c, 0x1b6d4e95, 0xdbb2c054, + 0x58a7fb7d, 0x987875bc, 0x991e9725, 0x59c119e4, 0x54f117d9, + 0x942e9918, 0x95487b81, 0x5597f540, 0xd682ce69, 0x165d40a8, + 0x173ba231, 0xd7e42cf0, 0x1110d463, 0xd1cf5aa2, 0xd0a9b83b, + 0x107636fa, 0x93630dd3, 0x53bc8312, 0x52da618b, 0x9205ef4a, + 0x48ba7df1, 0x8865f330, 0x890311a9, 0x49dc9f68, 0xcac9a441, + 0x0a162a80, 0x0b70c819, 0xcbaf46d8, 0x0d5bbe4b, 0xcd84308a, + 0xcce2d213, 0x0c3d5cd2, 0x8f2867fb, 0x4ff7e93a, 0x4e910ba3, + 0x8e4e8562, 0x837e8b5f, 0x43a1059e, 0x42c7e707, 0x821869c6, + 0x010d52ef, 0xc1d2dc2e, 0xc0b43eb7, 0x006bb076, 0xc69f48e5, + 0x0640c624, 0x072624bd, 0xc7f9aa7c, 0x44ec9155, 0x84331f94, + 0x8555fd0d, 0x458a73cc, 0x702ca9a1, 0xb0f32760, 0xb195c5f9, + 0x714a4b38, 0xf25f7011, 0x3280fed0, 0x33e61c49, 0xf3399288, + 0x35cd6a1b, 0xf512e4da, 0xf4740643, 0x34ab8882, 0xb7beb3ab, + 0x77613d6a, 0x7607dff3, 0xb6d85132, 0xbbe85f0f, 0x7b37d1ce, + 0x7a513357, 0xba8ebd96, 0x399b86bf, 0xf944087e, 0xf822eae7, + 0x38fd6426, 0xfe099cb5, 0x3ed61274, 0x3fb0f0ed, 0xff6f7e2c, + 0x7c7a4505, 0xbca5cbc4, 0xbdc3295d, 0x7d1ca79c, 0xa7a33527, + 0x677cbbe6, 0x661a597f, 0xa6c5d7be, 0x25d0ec97, 0xe50f6256, + 0xe46980cf, 0x24b60e0e, 0xe242f69d, 0x229d785c, 0x23fb9ac5, + 0xe3241404, 0x60312f2d, 0xa0eea1ec, 0xa1884375, 0x6157cdb4, + 0x6c67c389, 0xacb84d48, 0xaddeafd1, 0x6d012110, 0xee141a39, + 0x2ecb94f8, 0x2fad7661, 0xef72f8a0, 0x29860033, 0xe9598ef2, + 0xe83f6c6b, 0x28e0e2aa, 0xabf5d983, 0x6b2a5742, 0x6a4cb5db, + 0xaa933b1a}, + {0x00000000, 0x6f4ca59b, 0x9f9e3bec, 0xf0d29e77, 0x7f3b0603, + 0x1077a398, 0xe0a53def, 0x8fe99874, 0xfe760c06, 0x913aa99d, + 0x61e837ea, 0x0ea49271, 0x814d0a05, 0xee01af9e, 0x1ed331e9, + 0x719f9472, 0xfced180c, 0x93a1bd97, 0x637323e0, 0x0c3f867b, + 0x83d61e0f, 0xec9abb94, 0x1c4825e3, 0x73048078, 0x029b140a, + 0x6dd7b191, 0x9d052fe6, 0xf2498a7d, 0x7da01209, 0x12ecb792, + 0xe23e29e5, 0x8d728c7e, 0xf8db3118, 0x97979483, 0x67450af4, + 0x0809af6f, 0x87e0371b, 0xe8ac9280, 0x187e0cf7, 0x7732a96c, + 0x06ad3d1e, 0x69e19885, 0x993306f2, 0xf67fa369, 0x79963b1d, + 0x16da9e86, 0xe60800f1, 0x8944a56a, 0x04362914, 0x6b7a8c8f, + 0x9ba812f8, 0xf4e4b763, 0x7b0d2f17, 0x14418a8c, 0xe49314fb, + 0x8bdfb160, 0xfa402512, 0x950c8089, 0x65de1efe, 0x0a92bb65, + 0x857b2311, 0xea37868a, 0x1ae518fd, 0x75a9bd66, 0xf0b76330, + 0x9ffbc6ab, 0x6f2958dc, 0x0065fd47, 0x8f8c6533, 0xe0c0c0a8, + 0x10125edf, 0x7f5efb44, 0x0ec16f36, 0x618dcaad, 0x915f54da, + 0xfe13f141, 0x71fa6935, 0x1eb6ccae, 0xee6452d9, 0x8128f742, + 0x0c5a7b3c, 0x6316dea7, 0x93c440d0, 0xfc88e54b, 0x73617d3f, + 0x1c2dd8a4, 0xecff46d3, 0x83b3e348, 0xf22c773a, 0x9d60d2a1, + 0x6db24cd6, 0x02fee94d, 0x8d177139, 0xe25bd4a2, 0x12894ad5, + 0x7dc5ef4e, 0x086c5228, 0x6720f7b3, 0x97f269c4, 0xf8becc5f, + 0x7757542b, 0x181bf1b0, 0xe8c96fc7, 0x8785ca5c, 0xf61a5e2e, + 0x9956fbb5, 0x698465c2, 0x06c8c059, 0x8921582d, 0xe66dfdb6, + 0x16bf63c1, 0x79f3c65a, 0xf4814a24, 0x9bcdefbf, 0x6b1f71c8, + 0x0453d453, 0x8bba4c27, 0xe4f6e9bc, 0x142477cb, 0x7b68d250, + 0x0af74622, 0x65bbe3b9, 0x95697dce, 0xfa25d855, 0x75cc4021, + 0x1a80e5ba, 0xea527bcd, 0x851ede56, 0xe06fc760, 0x8f2362fb, + 0x7ff1fc8c, 0x10bd5917, 0x9f54c163, 0xf01864f8, 0x00cafa8f, + 0x6f865f14, 0x1e19cb66, 0x71556efd, 0x8187f08a, 0xeecb5511, + 0x6122cd65, 0x0e6e68fe, 0xfebcf689, 0x91f05312, 0x1c82df6c, + 0x73ce7af7, 0x831ce480, 0xec50411b, 0x63b9d96f, 0x0cf57cf4, + 0xfc27e283, 0x936b4718, 0xe2f4d36a, 0x8db876f1, 0x7d6ae886, + 0x12264d1d, 0x9dcfd569, 0xf28370f2, 0x0251ee85, 0x6d1d4b1e, + 0x18b4f678, 0x77f853e3, 0x872acd94, 0xe866680f, 0x678ff07b, + 0x08c355e0, 0xf811cb97, 0x975d6e0c, 0xe6c2fa7e, 0x898e5fe5, + 0x795cc192, 0x16106409, 0x99f9fc7d, 0xf6b559e6, 0x0667c791, + 0x692b620a, 0xe459ee74, 0x8b154bef, 0x7bc7d598, 0x148b7003, + 0x9b62e877, 0xf42e4dec, 0x04fcd39b, 0x6bb07600, 0x1a2fe272, + 0x756347e9, 0x85b1d99e, 0xeafd7c05, 0x6514e471, 0x0a5841ea, + 0xfa8adf9d, 0x95c67a06, 0x10d8a450, 0x7f9401cb, 0x8f469fbc, + 0xe00a3a27, 0x6fe3a253, 0x00af07c8, 0xf07d99bf, 0x9f313c24, + 0xeeaea856, 0x81e20dcd, 0x713093ba, 0x1e7c3621, 0x9195ae55, + 0xfed90bce, 0x0e0b95b9, 0x61473022, 0xec35bc5c, 0x837919c7, + 0x73ab87b0, 0x1ce7222b, 0x930eba5f, 0xfc421fc4, 0x0c9081b3, + 0x63dc2428, 0x1243b05a, 0x7d0f15c1, 0x8ddd8bb6, 0xe2912e2d, + 0x6d78b659, 0x023413c2, 0xf2e68db5, 0x9daa282e, 0xe8039548, + 0x874f30d3, 0x779daea4, 0x18d10b3f, 0x9738934b, 0xf87436d0, + 0x08a6a8a7, 0x67ea0d3c, 0x1675994e, 0x79393cd5, 0x89eba2a2, + 0xe6a70739, 0x694e9f4d, 0x06023ad6, 0xf6d0a4a1, 0x999c013a, + 0x14ee8d44, 0x7ba228df, 0x8b70b6a8, 0xe43c1333, 0x6bd58b47, + 0x04992edc, 0xf44bb0ab, 0x9b071530, 0xea988142, 0x85d424d9, + 0x7506baae, 0x1a4a1f35, 0x95a38741, 0xfaef22da, 0x0a3dbcad, + 0x65711936}}; + +#endif + +#endif + +#if N == 4 + +#if W == 8 + +local const z_crc_t FAR crc_braid_table[][256] = { + {0x00000000, 0xf1da05aa, 0x38c50d15, 0xc91f08bf, 0x718a1a2a, + 0x80501f80, 0x494f173f, 0xb8951295, 0xe3143454, 0x12ce31fe, + 0xdbd13941, 0x2a0b3ceb, 0x929e2e7e, 0x63442bd4, 0xaa5b236b, + 0x5b8126c1, 0x1d596ee9, 0xec836b43, 0x259c63fc, 0xd4466656, + 0x6cd374c3, 0x9d097169, 0x541679d6, 0xa5cc7c7c, 0xfe4d5abd, + 0x0f975f17, 0xc68857a8, 0x37525202, 0x8fc74097, 0x7e1d453d, + 0xb7024d82, 0x46d84828, 0x3ab2ddd2, 0xcb68d878, 0x0277d0c7, + 0xf3add56d, 0x4b38c7f8, 0xbae2c252, 0x73fdcaed, 0x8227cf47, + 0xd9a6e986, 0x287cec2c, 0xe163e493, 0x10b9e139, 0xa82cf3ac, + 0x59f6f606, 0x90e9feb9, 0x6133fb13, 0x27ebb33b, 0xd631b691, + 0x1f2ebe2e, 0xeef4bb84, 0x5661a911, 0xa7bbacbb, 0x6ea4a404, + 0x9f7ea1ae, 0xc4ff876f, 0x352582c5, 0xfc3a8a7a, 0x0de08fd0, + 0xb5759d45, 0x44af98ef, 0x8db09050, 0x7c6a95fa, 0x7565bba4, + 0x84bfbe0e, 0x4da0b6b1, 0xbc7ab31b, 0x04efa18e, 0xf535a424, + 0x3c2aac9b, 0xcdf0a931, 0x96718ff0, 0x67ab8a5a, 0xaeb482e5, + 0x5f6e874f, 0xe7fb95da, 0x16219070, 0xdf3e98cf, 0x2ee49d65, + 0x683cd54d, 0x99e6d0e7, 0x50f9d858, 0xa123ddf2, 0x19b6cf67, + 0xe86ccacd, 0x2173c272, 0xd0a9c7d8, 0x8b28e119, 0x7af2e4b3, + 0xb3edec0c, 0x4237e9a6, 0xfaa2fb33, 0x0b78fe99, 0xc267f626, + 0x33bdf38c, 0x4fd76676, 0xbe0d63dc, 0x77126b63, 0x86c86ec9, + 0x3e5d7c5c, 0xcf8779f6, 0x06987149, 0xf74274e3, 0xacc35222, + 0x5d195788, 0x94065f37, 0x65dc5a9d, 0xdd494808, 0x2c934da2, + 0xe58c451d, 0x145640b7, 0x528e089f, 0xa3540d35, 0x6a4b058a, + 0x9b910020, 0x230412b5, 0xd2de171f, 0x1bc11fa0, 0xea1b1a0a, + 0xb19a3ccb, 0x40403961, 0x895f31de, 0x78853474, 0xc01026e1, + 0x31ca234b, 0xf8d52bf4, 0x090f2e5e, 0xeacb7748, 0x1b1172e2, + 0xd20e7a5d, 0x23d47ff7, 0x9b416d62, 0x6a9b68c8, 0xa3846077, + 0x525e65dd, 0x09df431c, 0xf80546b6, 0x311a4e09, 0xc0c04ba3, + 0x78555936, 0x898f5c9c, 0x40905423, 0xb14a5189, 0xf79219a1, + 0x06481c0b, 0xcf5714b4, 0x3e8d111e, 0x8618038b, 0x77c20621, + 0xbedd0e9e, 0x4f070b34, 0x14862df5, 0xe55c285f, 0x2c4320e0, + 0xdd99254a, 0x650c37df, 0x94d63275, 0x5dc93aca, 0xac133f60, + 0xd079aa9a, 0x21a3af30, 0xe8bca78f, 0x1966a225, 0xa1f3b0b0, + 0x5029b51a, 0x9936bda5, 0x68ecb80f, 0x336d9ece, 0xc2b79b64, + 0x0ba893db, 0xfa729671, 0x42e784e4, 0xb33d814e, 0x7a2289f1, + 0x8bf88c5b, 0xcd20c473, 0x3cfac1d9, 0xf5e5c966, 0x043fcccc, + 0xbcaade59, 0x4d70dbf3, 0x846fd34c, 0x75b5d6e6, 0x2e34f027, + 0xdfeef58d, 0x16f1fd32, 0xe72bf898, 0x5fbeea0d, 0xae64efa7, + 0x677be718, 0x96a1e2b2, 0x9faeccec, 0x6e74c946, 0xa76bc1f9, + 0x56b1c453, 0xee24d6c6, 0x1ffed36c, 0xd6e1dbd3, 0x273bde79, + 0x7cbaf8b8, 0x8d60fd12, 0x447ff5ad, 0xb5a5f007, 0x0d30e292, + 0xfceae738, 0x35f5ef87, 0xc42fea2d, 0x82f7a205, 0x732da7af, + 0xba32af10, 0x4be8aaba, 0xf37db82f, 0x02a7bd85, 0xcbb8b53a, + 0x3a62b090, 0x61e39651, 0x903993fb, 0x59269b44, 0xa8fc9eee, + 0x10698c7b, 0xe1b389d1, 0x28ac816e, 0xd97684c4, 0xa51c113e, + 0x54c61494, 0x9dd91c2b, 0x6c031981, 0xd4960b14, 0x254c0ebe, + 0xec530601, 0x1d8903ab, 0x4608256a, 0xb7d220c0, 0x7ecd287f, + 0x8f172dd5, 0x37823f40, 0xc6583aea, 0x0f473255, 0xfe9d37ff, + 0xb8457fd7, 0x499f7a7d, 0x808072c2, 0x715a7768, 0xc9cf65fd, + 0x38156057, 0xf10a68e8, 0x00d06d42, 0x5b514b83, 0xaa8b4e29, + 0x63944696, 0x924e433c, 0x2adb51a9, 0xdb015403, 0x121e5cbc, + 0xe3c45916}, + {0x00000000, 0x0ee7e8d1, 0x1dcfd1a2, 0x13283973, 0x3b9fa344, + 0x35784b95, 0x265072e6, 0x28b79a37, 0x773f4688, 0x79d8ae59, + 0x6af0972a, 0x64177ffb, 0x4ca0e5cc, 0x42470d1d, 0x516f346e, + 0x5f88dcbf, 0xee7e8d10, 0xe09965c1, 0xf3b15cb2, 0xfd56b463, + 0xd5e12e54, 0xdb06c685, 0xc82efff6, 0xc6c91727, 0x9941cb98, + 0x97a62349, 0x848e1a3a, 0x8a69f2eb, 0xa2de68dc, 0xac39800d, + 0xbf11b97e, 0xb1f651af, 0x078c1c61, 0x096bf4b0, 0x1a43cdc3, + 0x14a42512, 0x3c13bf25, 0x32f457f4, 0x21dc6e87, 0x2f3b8656, + 0x70b35ae9, 0x7e54b238, 0x6d7c8b4b, 0x639b639a, 0x4b2cf9ad, + 0x45cb117c, 0x56e3280f, 0x5804c0de, 0xe9f29171, 0xe71579a0, + 0xf43d40d3, 0xfadaa802, 0xd26d3235, 0xdc8adae4, 0xcfa2e397, + 0xc1450b46, 0x9ecdd7f9, 0x902a3f28, 0x8302065b, 0x8de5ee8a, + 0xa55274bd, 0xabb59c6c, 0xb89da51f, 0xb67a4dce, 0x0f1838c2, + 0x01ffd013, 0x12d7e960, 0x1c3001b1, 0x34879b86, 0x3a607357, + 0x29484a24, 0x27afa2f5, 0x78277e4a, 0x76c0969b, 0x65e8afe8, + 0x6b0f4739, 0x43b8dd0e, 0x4d5f35df, 0x5e770cac, 0x5090e47d, + 0xe166b5d2, 0xef815d03, 0xfca96470, 0xf24e8ca1, 0xdaf91696, + 0xd41efe47, 0xc736c734, 0xc9d12fe5, 0x9659f35a, 0x98be1b8b, + 0x8b9622f8, 0x8571ca29, 0xadc6501e, 0xa321b8cf, 0xb00981bc, + 0xbeee696d, 0x089424a3, 0x0673cc72, 0x155bf501, 0x1bbc1dd0, + 0x330b87e7, 0x3dec6f36, 0x2ec45645, 0x2023be94, 0x7fab622b, + 0x714c8afa, 0x6264b389, 0x6c835b58, 0x4434c16f, 0x4ad329be, + 0x59fb10cd, 0x571cf81c, 0xe6eaa9b3, 0xe80d4162, 0xfb257811, + 0xf5c290c0, 0xdd750af7, 0xd392e226, 0xc0badb55, 0xce5d3384, + 0x91d5ef3b, 0x9f3207ea, 0x8c1a3e99, 0x82fdd648, 0xaa4a4c7f, + 0xa4ada4ae, 0xb7859ddd, 0xb962750c, 0x1e307184, 0x10d79955, + 0x03ffa026, 0x0d1848f7, 0x25afd2c0, 0x2b483a11, 0x38600362, + 0x3687ebb3, 0x690f370c, 0x67e8dfdd, 0x74c0e6ae, 0x7a270e7f, + 0x52909448, 0x5c777c99, 0x4f5f45ea, 0x41b8ad3b, 0xf04efc94, + 0xfea91445, 0xed812d36, 0xe366c5e7, 0xcbd15fd0, 0xc536b701, + 0xd61e8e72, 0xd8f966a3, 0x8771ba1c, 0x899652cd, 0x9abe6bbe, + 0x9459836f, 0xbcee1958, 0xb209f189, 0xa121c8fa, 0xafc6202b, + 0x19bc6de5, 0x175b8534, 0x0473bc47, 0x0a945496, 0x2223cea1, + 0x2cc42670, 0x3fec1f03, 0x310bf7d2, 0x6e832b6d, 0x6064c3bc, + 0x734cfacf, 0x7dab121e, 0x551c8829, 0x5bfb60f8, 0x48d3598b, + 0x4634b15a, 0xf7c2e0f5, 0xf9250824, 0xea0d3157, 0xe4ead986, + 0xcc5d43b1, 0xc2baab60, 0xd1929213, 0xdf757ac2, 0x80fda67d, + 0x8e1a4eac, 0x9d3277df, 0x93d59f0e, 0xbb620539, 0xb585ede8, + 0xa6add49b, 0xa84a3c4a, 0x11284946, 0x1fcfa197, 0x0ce798e4, + 0x02007035, 0x2ab7ea02, 0x245002d3, 0x37783ba0, 0x399fd371, + 0x66170fce, 0x68f0e71f, 0x7bd8de6c, 0x753f36bd, 0x5d88ac8a, + 0x536f445b, 0x40477d28, 0x4ea095f9, 0xff56c456, 0xf1b12c87, + 0xe29915f4, 0xec7efd25, 0xc4c96712, 0xca2e8fc3, 0xd906b6b0, + 0xd7e15e61, 0x886982de, 0x868e6a0f, 0x95a6537c, 0x9b41bbad, + 0xb3f6219a, 0xbd11c94b, 0xae39f038, 0xa0de18e9, 0x16a45527, + 0x1843bdf6, 0x0b6b8485, 0x058c6c54, 0x2d3bf663, 0x23dc1eb2, + 0x30f427c1, 0x3e13cf10, 0x619b13af, 0x6f7cfb7e, 0x7c54c20d, + 0x72b32adc, 0x5a04b0eb, 0x54e3583a, 0x47cb6149, 0x492c8998, + 0xf8dad837, 0xf63d30e6, 0xe5150995, 0xebf2e144, 0xc3457b73, + 0xcda293a2, 0xde8aaad1, 0xd06d4200, 0x8fe59ebf, 0x8102766e, + 0x922a4f1d, 0x9ccda7cc, 0xb47a3dfb, 0xba9dd52a, 0xa9b5ec59, + 0xa7520488}, + {0x00000000, 0x3c60e308, 0x78c1c610, 0x44a12518, 0xf1838c20, + 0xcde36f28, 0x89424a30, 0xb522a938, 0x38761e01, 0x0416fd09, + 0x40b7d811, 0x7cd73b19, 0xc9f59221, 0xf5957129, 0xb1345431, + 0x8d54b739, 0x70ec3c02, 0x4c8cdf0a, 0x082dfa12, 0x344d191a, + 0x816fb022, 0xbd0f532a, 0xf9ae7632, 0xc5ce953a, 0x489a2203, + 0x74fac10b, 0x305be413, 0x0c3b071b, 0xb919ae23, 0x85794d2b, + 0xc1d86833, 0xfdb88b3b, 0xe1d87804, 0xddb89b0c, 0x9919be14, + 0xa5795d1c, 0x105bf424, 0x2c3b172c, 0x689a3234, 0x54fad13c, + 0xd9ae6605, 0xe5ce850d, 0xa16fa015, 0x9d0f431d, 0x282dea25, + 0x144d092d, 0x50ec2c35, 0x6c8ccf3d, 0x91344406, 0xad54a70e, + 0xe9f58216, 0xd595611e, 0x60b7c826, 0x5cd72b2e, 0x18760e36, + 0x2416ed3e, 0xa9425a07, 0x9522b90f, 0xd1839c17, 0xede37f1f, + 0x58c1d627, 0x64a1352f, 0x20001037, 0x1c60f33f, 0x18c1f649, + 0x24a11541, 0x60003059, 0x5c60d351, 0xe9427a69, 0xd5229961, + 0x9183bc79, 0xade35f71, 0x20b7e848, 0x1cd70b40, 0x58762e58, + 0x6416cd50, 0xd1346468, 0xed548760, 0xa9f5a278, 0x95954170, + 0x682dca4b, 0x544d2943, 0x10ec0c5b, 0x2c8cef53, 0x99ae466b, + 0xa5cea563, 0xe16f807b, 0xdd0f6373, 0x505bd44a, 0x6c3b3742, + 0x289a125a, 0x14faf152, 0xa1d8586a, 0x9db8bb62, 0xd9199e7a, + 0xe5797d72, 0xf9198e4d, 0xc5796d45, 0x81d8485d, 0xbdb8ab55, + 0x089a026d, 0x34fae165, 0x705bc47d, 0x4c3b2775, 0xc16f904c, + 0xfd0f7344, 0xb9ae565c, 0x85ceb554, 0x30ec1c6c, 0x0c8cff64, + 0x482dda7c, 0x744d3974, 0x89f5b24f, 0xb5955147, 0xf134745f, + 0xcd549757, 0x78763e6f, 0x4416dd67, 0x00b7f87f, 0x3cd71b77, + 0xb183ac4e, 0x8de34f46, 0xc9426a5e, 0xf5228956, 0x4000206e, + 0x7c60c366, 0x38c1e67e, 0x04a10576, 0x3183ec92, 0x0de30f9a, + 0x49422a82, 0x7522c98a, 0xc00060b2, 0xfc6083ba, 0xb8c1a6a2, + 0x84a145aa, 0x09f5f293, 0x3595119b, 0x71343483, 0x4d54d78b, + 0xf8767eb3, 0xc4169dbb, 0x80b7b8a3, 0xbcd75bab, 0x416fd090, + 0x7d0f3398, 0x39ae1680, 0x05cef588, 0xb0ec5cb0, 0x8c8cbfb8, + 0xc82d9aa0, 0xf44d79a8, 0x7919ce91, 0x45792d99, 0x01d80881, + 0x3db8eb89, 0x889a42b1, 0xb4faa1b9, 0xf05b84a1, 0xcc3b67a9, + 0xd05b9496, 0xec3b779e, 0xa89a5286, 0x94fab18e, 0x21d818b6, + 0x1db8fbbe, 0x5919dea6, 0x65793dae, 0xe82d8a97, 0xd44d699f, + 0x90ec4c87, 0xac8caf8f, 0x19ae06b7, 0x25cee5bf, 0x616fc0a7, + 0x5d0f23af, 0xa0b7a894, 0x9cd74b9c, 0xd8766e84, 0xe4168d8c, + 0x513424b4, 0x6d54c7bc, 0x29f5e2a4, 0x159501ac, 0x98c1b695, + 0xa4a1559d, 0xe0007085, 0xdc60938d, 0x69423ab5, 0x5522d9bd, + 0x1183fca5, 0x2de31fad, 0x29421adb, 0x1522f9d3, 0x5183dccb, + 0x6de33fc3, 0xd8c196fb, 0xe4a175f3, 0xa00050eb, 0x9c60b3e3, + 0x113404da, 0x2d54e7d2, 0x69f5c2ca, 0x559521c2, 0xe0b788fa, + 0xdcd76bf2, 0x98764eea, 0xa416ade2, 0x59ae26d9, 0x65cec5d1, + 0x216fe0c9, 0x1d0f03c1, 0xa82daaf9, 0x944d49f1, 0xd0ec6ce9, + 0xec8c8fe1, 0x61d838d8, 0x5db8dbd0, 0x1919fec8, 0x25791dc0, + 0x905bb4f8, 0xac3b57f0, 0xe89a72e8, 0xd4fa91e0, 0xc89a62df, + 0xf4fa81d7, 0xb05ba4cf, 0x8c3b47c7, 0x3919eeff, 0x05790df7, + 0x41d828ef, 0x7db8cbe7, 0xf0ec7cde, 0xcc8c9fd6, 0x882dbace, + 0xb44d59c6, 0x016ff0fe, 0x3d0f13f6, 0x79ae36ee, 0x45ced5e6, + 0xb8765edd, 0x8416bdd5, 0xc0b798cd, 0xfcd77bc5, 0x49f5d2fd, + 0x759531f5, 0x313414ed, 0x0d54f7e5, 0x800040dc, 0xbc60a3d4, + 0xf8c186cc, 0xc4a165c4, 0x7183ccfc, 0x4de32ff4, 0x09420aec, + 0x3522e9e4}, + {0x00000000, 0x6307d924, 0xc60fb248, 0xa5086b6c, 0x576e62d1, + 0x3469bbf5, 0x9161d099, 0xf26609bd, 0xaedcc5a2, 0xcddb1c86, + 0x68d377ea, 0x0bd4aece, 0xf9b2a773, 0x9ab57e57, 0x3fbd153b, + 0x5cbacc1f, 0x86c88d05, 0xe5cf5421, 0x40c73f4d, 0x23c0e669, + 0xd1a6efd4, 0xb2a136f0, 0x17a95d9c, 0x74ae84b8, 0x281448a7, + 0x4b139183, 0xee1bfaef, 0x8d1c23cb, 0x7f7a2a76, 0x1c7df352, + 0xb975983e, 0xda72411a, 0xd6e01c4b, 0xb5e7c56f, 0x10efae03, + 0x73e87727, 0x818e7e9a, 0xe289a7be, 0x4781ccd2, 0x248615f6, + 0x783cd9e9, 0x1b3b00cd, 0xbe336ba1, 0xdd34b285, 0x2f52bb38, + 0x4c55621c, 0xe95d0970, 0x8a5ad054, 0x5028914e, 0x332f486a, + 0x96272306, 0xf520fa22, 0x0746f39f, 0x64412abb, 0xc14941d7, + 0xa24e98f3, 0xfef454ec, 0x9df38dc8, 0x38fbe6a4, 0x5bfc3f80, + 0xa99a363d, 0xca9def19, 0x6f958475, 0x0c925d51, 0x76b13ed7, + 0x15b6e7f3, 0xb0be8c9f, 0xd3b955bb, 0x21df5c06, 0x42d88522, + 0xe7d0ee4e, 0x84d7376a, 0xd86dfb75, 0xbb6a2251, 0x1e62493d, + 0x7d659019, 0x8f0399a4, 0xec044080, 0x490c2bec, 0x2a0bf2c8, + 0xf079b3d2, 0x937e6af6, 0x3676019a, 0x5571d8be, 0xa717d103, + 0xc4100827, 0x6118634b, 0x021fba6f, 0x5ea57670, 0x3da2af54, + 0x98aac438, 0xfbad1d1c, 0x09cb14a1, 0x6acccd85, 0xcfc4a6e9, + 0xacc37fcd, 0xa051229c, 0xc356fbb8, 0x665e90d4, 0x055949f0, + 0xf73f404d, 0x94389969, 0x3130f205, 0x52372b21, 0x0e8de73e, + 0x6d8a3e1a, 0xc8825576, 0xab858c52, 0x59e385ef, 0x3ae45ccb, + 0x9fec37a7, 0xfcebee83, 0x2699af99, 0x459e76bd, 0xe0961dd1, + 0x8391c4f5, 0x71f7cd48, 0x12f0146c, 0xb7f87f00, 0xd4ffa624, + 0x88456a3b, 0xeb42b31f, 0x4e4ad873, 0x2d4d0157, 0xdf2b08ea, + 0xbc2cd1ce, 0x1924baa2, 0x7a236386, 0xed627dae, 0x8e65a48a, + 0x2b6dcfe6, 0x486a16c2, 0xba0c1f7f, 0xd90bc65b, 0x7c03ad37, + 0x1f047413, 0x43beb80c, 0x20b96128, 0x85b10a44, 0xe6b6d360, + 0x14d0dadd, 0x77d703f9, 0xd2df6895, 0xb1d8b1b1, 0x6baaf0ab, + 0x08ad298f, 0xada542e3, 0xcea29bc7, 0x3cc4927a, 0x5fc34b5e, + 0xfacb2032, 0x99ccf916, 0xc5763509, 0xa671ec2d, 0x03798741, + 0x607e5e65, 0x921857d8, 0xf11f8efc, 0x5417e590, 0x37103cb4, + 0x3b8261e5, 0x5885b8c1, 0xfd8dd3ad, 0x9e8a0a89, 0x6cec0334, + 0x0febda10, 0xaae3b17c, 0xc9e46858, 0x955ea447, 0xf6597d63, + 0x5351160f, 0x3056cf2b, 0xc230c696, 0xa1371fb2, 0x043f74de, + 0x6738adfa, 0xbd4aece0, 0xde4d35c4, 0x7b455ea8, 0x1842878c, + 0xea248e31, 0x89235715, 0x2c2b3c79, 0x4f2ce55d, 0x13962942, + 0x7091f066, 0xd5999b0a, 0xb69e422e, 0x44f84b93, 0x27ff92b7, + 0x82f7f9db, 0xe1f020ff, 0x9bd34379, 0xf8d49a5d, 0x5ddcf131, + 0x3edb2815, 0xccbd21a8, 0xafbaf88c, 0x0ab293e0, 0x69b54ac4, + 0x350f86db, 0x56085fff, 0xf3003493, 0x9007edb7, 0x6261e40a, + 0x01663d2e, 0xa46e5642, 0xc7698f66, 0x1d1bce7c, 0x7e1c1758, + 0xdb147c34, 0xb813a510, 0x4a75acad, 0x29727589, 0x8c7a1ee5, + 0xef7dc7c1, 0xb3c70bde, 0xd0c0d2fa, 0x75c8b996, 0x16cf60b2, + 0xe4a9690f, 0x87aeb02b, 0x22a6db47, 0x41a10263, 0x4d335f32, + 0x2e348616, 0x8b3ced7a, 0xe83b345e, 0x1a5d3de3, 0x795ae4c7, + 0xdc528fab, 0xbf55568f, 0xe3ef9a90, 0x80e843b4, 0x25e028d8, + 0x46e7f1fc, 0xb481f841, 0xd7862165, 0x728e4a09, 0x1189932d, + 0xcbfbd237, 0xa8fc0b13, 0x0df4607f, 0x6ef3b95b, 0x9c95b0e6, + 0xff9269c2, 0x5a9a02ae, 0x399ddb8a, 0x65271795, 0x0620ceb1, + 0xa328a5dd, 0xc02f7cf9, 0x32497544, 0x514eac60, 0xf446c70c, + 0x97411e28}, + {0x00000000, 0x01b5fd1d, 0x036bfa3a, 0x02de0727, 0x06d7f474, + 0x07620969, 0x05bc0e4e, 0x0409f353, 0x0dafe8e8, 0x0c1a15f5, + 0x0ec412d2, 0x0f71efcf, 0x0b781c9c, 0x0acde181, 0x0813e6a6, + 0x09a61bbb, 0x1b5fd1d0, 0x1aea2ccd, 0x18342bea, 0x1981d6f7, + 0x1d8825a4, 0x1c3dd8b9, 0x1ee3df9e, 0x1f562283, 0x16f03938, + 0x1745c425, 0x159bc302, 0x142e3e1f, 0x1027cd4c, 0x11923051, + 0x134c3776, 0x12f9ca6b, 0x36bfa3a0, 0x370a5ebd, 0x35d4599a, + 0x3461a487, 0x306857d4, 0x31ddaac9, 0x3303adee, 0x32b650f3, + 0x3b104b48, 0x3aa5b655, 0x387bb172, 0x39ce4c6f, 0x3dc7bf3c, + 0x3c724221, 0x3eac4506, 0x3f19b81b, 0x2de07270, 0x2c558f6d, + 0x2e8b884a, 0x2f3e7557, 0x2b378604, 0x2a827b19, 0x285c7c3e, + 0x29e98123, 0x204f9a98, 0x21fa6785, 0x232460a2, 0x22919dbf, + 0x26986eec, 0x272d93f1, 0x25f394d6, 0x244669cb, 0x6d7f4740, + 0x6ccaba5d, 0x6e14bd7a, 0x6fa14067, 0x6ba8b334, 0x6a1d4e29, + 0x68c3490e, 0x6976b413, 0x60d0afa8, 0x616552b5, 0x63bb5592, + 0x620ea88f, 0x66075bdc, 0x67b2a6c1, 0x656ca1e6, 0x64d95cfb, + 0x76209690, 0x77956b8d, 0x754b6caa, 0x74fe91b7, 0x70f762e4, + 0x71429ff9, 0x739c98de, 0x722965c3, 0x7b8f7e78, 0x7a3a8365, + 0x78e48442, 0x7951795f, 0x7d588a0c, 0x7ced7711, 0x7e337036, + 0x7f868d2b, 0x5bc0e4e0, 0x5a7519fd, 0x58ab1eda, 0x591ee3c7, + 0x5d171094, 0x5ca2ed89, 0x5e7ceaae, 0x5fc917b3, 0x566f0c08, + 0x57daf115, 0x5504f632, 0x54b10b2f, 0x50b8f87c, 0x510d0561, + 0x53d30246, 0x5266ff5b, 0x409f3530, 0x412ac82d, 0x43f4cf0a, + 0x42413217, 0x4648c144, 0x47fd3c59, 0x45233b7e, 0x4496c663, + 0x4d30ddd8, 0x4c8520c5, 0x4e5b27e2, 0x4feedaff, 0x4be729ac, + 0x4a52d4b1, 0x488cd396, 0x49392e8b, 0xdafe8e80, 0xdb4b739d, + 0xd99574ba, 0xd82089a7, 0xdc297af4, 0xdd9c87e9, 0xdf4280ce, + 0xdef77dd3, 0xd7516668, 0xd6e49b75, 0xd43a9c52, 0xd58f614f, + 0xd186921c, 0xd0336f01, 0xd2ed6826, 0xd358953b, 0xc1a15f50, + 0xc014a24d, 0xc2caa56a, 0xc37f5877, 0xc776ab24, 0xc6c35639, + 0xc41d511e, 0xc5a8ac03, 0xcc0eb7b8, 0xcdbb4aa5, 0xcf654d82, + 0xced0b09f, 0xcad943cc, 0xcb6cbed1, 0xc9b2b9f6, 0xc80744eb, + 0xec412d20, 0xedf4d03d, 0xef2ad71a, 0xee9f2a07, 0xea96d954, + 0xeb232449, 0xe9fd236e, 0xe848de73, 0xe1eec5c8, 0xe05b38d5, + 0xe2853ff2, 0xe330c2ef, 0xe73931bc, 0xe68ccca1, 0xe452cb86, + 0xe5e7369b, 0xf71efcf0, 0xf6ab01ed, 0xf47506ca, 0xf5c0fbd7, + 0xf1c90884, 0xf07cf599, 0xf2a2f2be, 0xf3170fa3, 0xfab11418, + 0xfb04e905, 0xf9daee22, 0xf86f133f, 0xfc66e06c, 0xfdd31d71, + 0xff0d1a56, 0xfeb8e74b, 0xb781c9c0, 0xb63434dd, 0xb4ea33fa, + 0xb55fcee7, 0xb1563db4, 0xb0e3c0a9, 0xb23dc78e, 0xb3883a93, + 0xba2e2128, 0xbb9bdc35, 0xb945db12, 0xb8f0260f, 0xbcf9d55c, + 0xbd4c2841, 0xbf922f66, 0xbe27d27b, 0xacde1810, 0xad6be50d, + 0xafb5e22a, 0xae001f37, 0xaa09ec64, 0xabbc1179, 0xa962165e, + 0xa8d7eb43, 0xa171f0f8, 0xa0c40de5, 0xa21a0ac2, 0xa3aff7df, + 0xa7a6048c, 0xa613f991, 0xa4cdfeb6, 0xa57803ab, 0x813e6a60, + 0x808b977d, 0x8255905a, 0x83e06d47, 0x87e99e14, 0x865c6309, + 0x8482642e, 0x85379933, 0x8c918288, 0x8d247f95, 0x8ffa78b2, + 0x8e4f85af, 0x8a4676fc, 0x8bf38be1, 0x892d8cc6, 0x889871db, + 0x9a61bbb0, 0x9bd446ad, 0x990a418a, 0x98bfbc97, 0x9cb64fc4, + 0x9d03b2d9, 0x9fddb5fe, 0x9e6848e3, 0x97ce5358, 0x967bae45, + 0x94a5a962, 0x9510547f, 0x9119a72c, 0x90ac5a31, 0x92725d16, + 0x93c7a00b}, + {0x00000000, 0x6e8c1b41, 0xdd183682, 0xb3942dc3, 0x61416b45, + 0x0fcd7004, 0xbc595dc7, 0xd2d54686, 0xc282d68a, 0xac0ecdcb, + 0x1f9ae008, 0x7116fb49, 0xa3c3bdcf, 0xcd4fa68e, 0x7edb8b4d, + 0x1057900c, 0x5e74ab55, 0x30f8b014, 0x836c9dd7, 0xede08696, + 0x3f35c010, 0x51b9db51, 0xe22df692, 0x8ca1edd3, 0x9cf67ddf, + 0xf27a669e, 0x41ee4b5d, 0x2f62501c, 0xfdb7169a, 0x933b0ddb, + 0x20af2018, 0x4e233b59, 0xbce956aa, 0xd2654deb, 0x61f16028, + 0x0f7d7b69, 0xdda83def, 0xb32426ae, 0x00b00b6d, 0x6e3c102c, + 0x7e6b8020, 0x10e79b61, 0xa373b6a2, 0xcdffade3, 0x1f2aeb65, + 0x71a6f024, 0xc232dde7, 0xacbec6a6, 0xe29dfdff, 0x8c11e6be, + 0x3f85cb7d, 0x5109d03c, 0x83dc96ba, 0xed508dfb, 0x5ec4a038, + 0x3048bb79, 0x201f2b75, 0x4e933034, 0xfd071df7, 0x938b06b6, + 0x415e4030, 0x2fd25b71, 0x9c4676b2, 0xf2ca6df3, 0xa2a3ab15, + 0xcc2fb054, 0x7fbb9d97, 0x113786d6, 0xc3e2c050, 0xad6edb11, + 0x1efaf6d2, 0x7076ed93, 0x60217d9f, 0x0ead66de, 0xbd394b1d, + 0xd3b5505c, 0x016016da, 0x6fec0d9b, 0xdc782058, 0xb2f43b19, + 0xfcd70040, 0x925b1b01, 0x21cf36c2, 0x4f432d83, 0x9d966b05, + 0xf31a7044, 0x408e5d87, 0x2e0246c6, 0x3e55d6ca, 0x50d9cd8b, + 0xe34de048, 0x8dc1fb09, 0x5f14bd8f, 0x3198a6ce, 0x820c8b0d, + 0xec80904c, 0x1e4afdbf, 0x70c6e6fe, 0xc352cb3d, 0xadded07c, + 0x7f0b96fa, 0x11878dbb, 0xa213a078, 0xcc9fbb39, 0xdcc82b35, + 0xb2443074, 0x01d01db7, 0x6f5c06f6, 0xbd894070, 0xd3055b31, + 0x609176f2, 0x0e1d6db3, 0x403e56ea, 0x2eb24dab, 0x9d266068, + 0xf3aa7b29, 0x217f3daf, 0x4ff326ee, 0xfc670b2d, 0x92eb106c, + 0x82bc8060, 0xec309b21, 0x5fa4b6e2, 0x3128ada3, 0xe3fdeb25, + 0x8d71f064, 0x3ee5dda7, 0x5069c6e6, 0x9e36506b, 0xf0ba4b2a, + 0x432e66e9, 0x2da27da8, 0xff773b2e, 0x91fb206f, 0x226f0dac, + 0x4ce316ed, 0x5cb486e1, 0x32389da0, 0x81acb063, 0xef20ab22, + 0x3df5eda4, 0x5379f6e5, 0xe0eddb26, 0x8e61c067, 0xc042fb3e, + 0xaecee07f, 0x1d5acdbc, 0x73d6d6fd, 0xa103907b, 0xcf8f8b3a, + 0x7c1ba6f9, 0x1297bdb8, 0x02c02db4, 0x6c4c36f5, 0xdfd81b36, + 0xb1540077, 0x638146f1, 0x0d0d5db0, 0xbe997073, 0xd0156b32, + 0x22df06c1, 0x4c531d80, 0xffc73043, 0x914b2b02, 0x439e6d84, + 0x2d1276c5, 0x9e865b06, 0xf00a4047, 0xe05dd04b, 0x8ed1cb0a, + 0x3d45e6c9, 0x53c9fd88, 0x811cbb0e, 0xef90a04f, 0x5c048d8c, + 0x328896cd, 0x7cabad94, 0x1227b6d5, 0xa1b39b16, 0xcf3f8057, + 0x1deac6d1, 0x7366dd90, 0xc0f2f053, 0xae7eeb12, 0xbe297b1e, + 0xd0a5605f, 0x63314d9c, 0x0dbd56dd, 0xdf68105b, 0xb1e40b1a, + 0x027026d9, 0x6cfc3d98, 0x3c95fb7e, 0x5219e03f, 0xe18dcdfc, + 0x8f01d6bd, 0x5dd4903b, 0x33588b7a, 0x80cca6b9, 0xee40bdf8, + 0xfe172df4, 0x909b36b5, 0x230f1b76, 0x4d830037, 0x9f5646b1, + 0xf1da5df0, 0x424e7033, 0x2cc26b72, 0x62e1502b, 0x0c6d4b6a, + 0xbff966a9, 0xd1757de8, 0x03a03b6e, 0x6d2c202f, 0xdeb80dec, + 0xb03416ad, 0xa06386a1, 0xceef9de0, 0x7d7bb023, 0x13f7ab62, + 0xc122ede4, 0xafaef6a5, 0x1c3adb66, 0x72b6c027, 0x807cadd4, + 0xeef0b695, 0x5d649b56, 0x33e88017, 0xe13dc691, 0x8fb1ddd0, + 0x3c25f013, 0x52a9eb52, 0x42fe7b5e, 0x2c72601f, 0x9fe64ddc, + 0xf16a569d, 0x23bf101b, 0x4d330b5a, 0xfea72699, 0x902b3dd8, + 0xde080681, 0xb0841dc0, 0x03103003, 0x6d9c2b42, 0xbf496dc4, + 0xd1c57685, 0x62515b46, 0x0cdd4007, 0x1c8ad00b, 0x7206cb4a, + 0xc192e689, 0xaf1efdc8, 0x7dcbbb4e, 0x1347a00f, 0xa0d38dcc, + 0xce5f968d}, + {0x00000000, 0xe71da697, 0x154a4b6f, 0xf257edf8, 0x2a9496de, + 0xcd893049, 0x3fdeddb1, 0xd8c37b26, 0x55292dbc, 0xb2348b2b, + 0x406366d3, 0xa77ec044, 0x7fbdbb62, 0x98a01df5, 0x6af7f00d, + 0x8dea569a, 0xaa525b78, 0x4d4ffdef, 0xbf181017, 0x5805b680, + 0x80c6cda6, 0x67db6b31, 0x958c86c9, 0x7291205e, 0xff7b76c4, + 0x1866d053, 0xea313dab, 0x0d2c9b3c, 0xd5efe01a, 0x32f2468d, + 0xc0a5ab75, 0x27b80de2, 0x8fd5b0b1, 0x68c81626, 0x9a9ffbde, + 0x7d825d49, 0xa541266f, 0x425c80f8, 0xb00b6d00, 0x5716cb97, + 0xdafc9d0d, 0x3de13b9a, 0xcfb6d662, 0x28ab70f5, 0xf0680bd3, + 0x1775ad44, 0xe52240bc, 0x023fe62b, 0x2587ebc9, 0xc29a4d5e, + 0x30cda0a6, 0xd7d00631, 0x0f137d17, 0xe80edb80, 0x1a593678, + 0xfd4490ef, 0x70aec675, 0x97b360e2, 0x65e48d1a, 0x82f92b8d, + 0x5a3a50ab, 0xbd27f63c, 0x4f701bc4, 0xa86dbd53, 0xc4da6723, + 0x23c7c1b4, 0xd1902c4c, 0x368d8adb, 0xee4ef1fd, 0x0953576a, + 0xfb04ba92, 0x1c191c05, 0x91f34a9f, 0x76eeec08, 0x84b901f0, + 0x63a4a767, 0xbb67dc41, 0x5c7a7ad6, 0xae2d972e, 0x493031b9, + 0x6e883c5b, 0x89959acc, 0x7bc27734, 0x9cdfd1a3, 0x441caa85, + 0xa3010c12, 0x5156e1ea, 0xb64b477d, 0x3ba111e7, 0xdcbcb770, + 0x2eeb5a88, 0xc9f6fc1f, 0x11358739, 0xf62821ae, 0x047fcc56, + 0xe3626ac1, 0x4b0fd792, 0xac127105, 0x5e459cfd, 0xb9583a6a, + 0x619b414c, 0x8686e7db, 0x74d10a23, 0x93ccacb4, 0x1e26fa2e, + 0xf93b5cb9, 0x0b6cb141, 0xec7117d6, 0x34b26cf0, 0xd3afca67, + 0x21f8279f, 0xc6e58108, 0xe15d8cea, 0x06402a7d, 0xf417c785, + 0x130a6112, 0xcbc91a34, 0x2cd4bca3, 0xde83515b, 0x399ef7cc, + 0xb474a156, 0x536907c1, 0xa13eea39, 0x46234cae, 0x9ee03788, + 0x79fd911f, 0x8baa7ce7, 0x6cb7da70, 0x52c5c807, 0xb5d86e90, + 0x478f8368, 0xa09225ff, 0x78515ed9, 0x9f4cf84e, 0x6d1b15b6, + 0x8a06b321, 0x07ece5bb, 0xe0f1432c, 0x12a6aed4, 0xf5bb0843, + 0x2d787365, 0xca65d5f2, 0x3832380a, 0xdf2f9e9d, 0xf897937f, + 0x1f8a35e8, 0xedddd810, 0x0ac07e87, 0xd20305a1, 0x351ea336, + 0xc7494ece, 0x2054e859, 0xadbebec3, 0x4aa31854, 0xb8f4f5ac, + 0x5fe9533b, 0x872a281d, 0x60378e8a, 0x92606372, 0x757dc5e5, + 0xdd1078b6, 0x3a0dde21, 0xc85a33d9, 0x2f47954e, 0xf784ee68, + 0x109948ff, 0xe2cea507, 0x05d30390, 0x8839550a, 0x6f24f39d, + 0x9d731e65, 0x7a6eb8f2, 0xa2adc3d4, 0x45b06543, 0xb7e788bb, + 0x50fa2e2c, 0x774223ce, 0x905f8559, 0x620868a1, 0x8515ce36, + 0x5dd6b510, 0xbacb1387, 0x489cfe7f, 0xaf8158e8, 0x226b0e72, + 0xc576a8e5, 0x3721451d, 0xd03ce38a, 0x08ff98ac, 0xefe23e3b, + 0x1db5d3c3, 0xfaa87554, 0x961faf24, 0x710209b3, 0x8355e44b, + 0x644842dc, 0xbc8b39fa, 0x5b969f6d, 0xa9c17295, 0x4edcd402, + 0xc3368298, 0x242b240f, 0xd67cc9f7, 0x31616f60, 0xe9a21446, + 0x0ebfb2d1, 0xfce85f29, 0x1bf5f9be, 0x3c4df45c, 0xdb5052cb, + 0x2907bf33, 0xce1a19a4, 0x16d96282, 0xf1c4c415, 0x039329ed, + 0xe48e8f7a, 0x6964d9e0, 0x8e797f77, 0x7c2e928f, 0x9b333418, + 0x43f04f3e, 0xa4ede9a9, 0x56ba0451, 0xb1a7a2c6, 0x19ca1f95, + 0xfed7b902, 0x0c8054fa, 0xeb9df26d, 0x335e894b, 0xd4432fdc, + 0x2614c224, 0xc10964b3, 0x4ce33229, 0xabfe94be, 0x59a97946, + 0xbeb4dfd1, 0x6677a4f7, 0x816a0260, 0x733def98, 0x9420490f, + 0xb39844ed, 0x5485e27a, 0xa6d20f82, 0x41cfa915, 0x990cd233, + 0x7e1174a4, 0x8c46995c, 0x6b5b3fcb, 0xe6b16951, 0x01accfc6, + 0xf3fb223e, 0x14e684a9, 0xcc25ff8f, 0x2b385918, 0xd96fb4e0, + 0x3e721277}, + {0x00000000, 0xa58b900e, 0x9066265d, 0x35edb653, 0xfbbd4afb, + 0x5e36daf5, 0x6bdb6ca6, 0xce50fca8, 0x2c0b93b7, 0x898003b9, + 0xbc6db5ea, 0x19e625e4, 0xd7b6d94c, 0x723d4942, 0x47d0ff11, + 0xe25b6f1f, 0x5817276e, 0xfd9cb760, 0xc8710133, 0x6dfa913d, + 0xa3aa6d95, 0x0621fd9b, 0x33cc4bc8, 0x9647dbc6, 0x741cb4d9, + 0xd19724d7, 0xe47a9284, 0x41f1028a, 0x8fa1fe22, 0x2a2a6e2c, + 0x1fc7d87f, 0xba4c4871, 0xb02e4edc, 0x15a5ded2, 0x20486881, + 0x85c3f88f, 0x4b930427, 0xee189429, 0xdbf5227a, 0x7e7eb274, + 0x9c25dd6b, 0x39ae4d65, 0x0c43fb36, 0xa9c86b38, 0x67989790, + 0xc213079e, 0xf7feb1cd, 0x527521c3, 0xe83969b2, 0x4db2f9bc, + 0x785f4fef, 0xddd4dfe1, 0x13842349, 0xb60fb347, 0x83e20514, + 0x2669951a, 0xc432fa05, 0x61b96a0b, 0x5454dc58, 0xf1df4c56, + 0x3f8fb0fe, 0x9a0420f0, 0xafe996a3, 0x0a6206ad, 0xbb2d9bf9, + 0x1ea60bf7, 0x2b4bbda4, 0x8ec02daa, 0x4090d102, 0xe51b410c, + 0xd0f6f75f, 0x757d6751, 0x9726084e, 0x32ad9840, 0x07402e13, + 0xa2cbbe1d, 0x6c9b42b5, 0xc910d2bb, 0xfcfd64e8, 0x5976f4e6, + 0xe33abc97, 0x46b12c99, 0x735c9aca, 0xd6d70ac4, 0x1887f66c, + 0xbd0c6662, 0x88e1d031, 0x2d6a403f, 0xcf312f20, 0x6ababf2e, + 0x5f57097d, 0xfadc9973, 0x348c65db, 0x9107f5d5, 0xa4ea4386, + 0x0161d388, 0x0b03d525, 0xae88452b, 0x9b65f378, 0x3eee6376, + 0xf0be9fde, 0x55350fd0, 0x60d8b983, 0xc553298d, 0x27084692, + 0x8283d69c, 0xb76e60cf, 0x12e5f0c1, 0xdcb50c69, 0x793e9c67, + 0x4cd32a34, 0xe958ba3a, 0x5314f24b, 0xf69f6245, 0xc372d416, + 0x66f94418, 0xa8a9b8b0, 0x0d2228be, 0x38cf9eed, 0x9d440ee3, + 0x7f1f61fc, 0xda94f1f2, 0xef7947a1, 0x4af2d7af, 0x84a22b07, + 0x2129bb09, 0x14c40d5a, 0xb14f9d54, 0xad2a31b3, 0x08a1a1bd, + 0x3d4c17ee, 0x98c787e0, 0x56977b48, 0xf31ceb46, 0xc6f15d15, + 0x637acd1b, 0x8121a204, 0x24aa320a, 0x11478459, 0xb4cc1457, + 0x7a9ce8ff, 0xdf1778f1, 0xeafacea2, 0x4f715eac, 0xf53d16dd, + 0x50b686d3, 0x655b3080, 0xc0d0a08e, 0x0e805c26, 0xab0bcc28, + 0x9ee67a7b, 0x3b6dea75, 0xd936856a, 0x7cbd1564, 0x4950a337, + 0xecdb3339, 0x228bcf91, 0x87005f9f, 0xb2ede9cc, 0x176679c2, + 0x1d047f6f, 0xb88fef61, 0x8d625932, 0x28e9c93c, 0xe6b93594, + 0x4332a59a, 0x76df13c9, 0xd35483c7, 0x310fecd8, 0x94847cd6, + 0xa169ca85, 0x04e25a8b, 0xcab2a623, 0x6f39362d, 0x5ad4807e, + 0xff5f1070, 0x45135801, 0xe098c80f, 0xd5757e5c, 0x70feee52, + 0xbeae12fa, 0x1b2582f4, 0x2ec834a7, 0x8b43a4a9, 0x6918cbb6, + 0xcc935bb8, 0xf97eedeb, 0x5cf57de5, 0x92a5814d, 0x372e1143, + 0x02c3a710, 0xa748371e, 0x1607aa4a, 0xb38c3a44, 0x86618c17, + 0x23ea1c19, 0xedbae0b1, 0x483170bf, 0x7ddcc6ec, 0xd85756e2, + 0x3a0c39fd, 0x9f87a9f3, 0xaa6a1fa0, 0x0fe18fae, 0xc1b17306, + 0x643ae308, 0x51d7555b, 0xf45cc555, 0x4e108d24, 0xeb9b1d2a, + 0xde76ab79, 0x7bfd3b77, 0xb5adc7df, 0x102657d1, 0x25cbe182, + 0x8040718c, 0x621b1e93, 0xc7908e9d, 0xf27d38ce, 0x57f6a8c0, + 0x99a65468, 0x3c2dc466, 0x09c07235, 0xac4be23b, 0xa629e496, + 0x03a27498, 0x364fc2cb, 0x93c452c5, 0x5d94ae6d, 0xf81f3e63, + 0xcdf28830, 0x6879183e, 0x8a227721, 0x2fa9e72f, 0x1a44517c, + 0xbfcfc172, 0x719f3dda, 0xd414add4, 0xe1f91b87, 0x44728b89, + 0xfe3ec3f8, 0x5bb553f6, 0x6e58e5a5, 0xcbd375ab, 0x05838903, + 0xa008190d, 0x95e5af5e, 0x306e3f50, 0xd235504f, 0x77bec041, + 0x42537612, 0xe7d8e61c, 0x29881ab4, 0x8c038aba, 0xb9ee3ce9, + 0x1c65ace7}}; + +local const z_word_t FAR crc_braid_big_table[][256] = { + {0x0000000000000000, 0x0e908ba500000000, 0x5d26669000000000, + 0x53b6ed3500000000, 0xfb4abdfb00000000, 0xf5da365e00000000, + 0xa66cdb6b00000000, 0xa8fc50ce00000000, 0xb7930b2c00000000, + 0xb903808900000000, 0xeab56dbc00000000, 0xe425e61900000000, + 0x4cd9b6d700000000, 0x42493d7200000000, 0x11ffd04700000000, + 0x1f6f5be200000000, 0x6e27175800000000, 0x60b79cfd00000000, + 0x330171c800000000, 0x3d91fa6d00000000, 0x956daaa300000000, + 0x9bfd210600000000, 0xc84bcc3300000000, 0xc6db479600000000, + 0xd9b41c7400000000, 0xd72497d100000000, 0x84927ae400000000, + 0x8a02f14100000000, 0x22fea18f00000000, 0x2c6e2a2a00000000, + 0x7fd8c71f00000000, 0x71484cba00000000, 0xdc4e2eb000000000, + 0xd2dea51500000000, 0x8168482000000000, 0x8ff8c38500000000, + 0x2704934b00000000, 0x299418ee00000000, 0x7a22f5db00000000, + 0x74b27e7e00000000, 0x6bdd259c00000000, 0x654dae3900000000, + 0x36fb430c00000000, 0x386bc8a900000000, 0x9097986700000000, + 0x9e0713c200000000, 0xcdb1fef700000000, 0xc321755200000000, + 0xb26939e800000000, 0xbcf9b24d00000000, 0xef4f5f7800000000, + 0xe1dfd4dd00000000, 0x4923841300000000, 0x47b30fb600000000, + 0x1405e28300000000, 0x1a95692600000000, 0x05fa32c400000000, + 0x0b6ab96100000000, 0x58dc545400000000, 0x564cdff100000000, + 0xfeb08f3f00000000, 0xf020049a00000000, 0xa396e9af00000000, + 0xad06620a00000000, 0xf99b2dbb00000000, 0xf70ba61e00000000, + 0xa4bd4b2b00000000, 0xaa2dc08e00000000, 0x02d1904000000000, + 0x0c411be500000000, 0x5ff7f6d000000000, 0x51677d7500000000, + 0x4e08269700000000, 0x4098ad3200000000, 0x132e400700000000, + 0x1dbecba200000000, 0xb5429b6c00000000, 0xbbd210c900000000, + 0xe864fdfc00000000, 0xe6f4765900000000, 0x97bc3ae300000000, + 0x992cb14600000000, 0xca9a5c7300000000, 0xc40ad7d600000000, + 0x6cf6871800000000, 0x62660cbd00000000, 0x31d0e18800000000, + 0x3f406a2d00000000, 0x202f31cf00000000, 0x2ebfba6a00000000, + 0x7d09575f00000000, 0x7399dcfa00000000, 0xdb658c3400000000, + 0xd5f5079100000000, 0x8643eaa400000000, 0x88d3610100000000, + 0x25d5030b00000000, 0x2b4588ae00000000, 0x78f3659b00000000, + 0x7663ee3e00000000, 0xde9fbef000000000, 0xd00f355500000000, + 0x83b9d86000000000, 0x8d2953c500000000, 0x9246082700000000, + 0x9cd6838200000000, 0xcf606eb700000000, 0xc1f0e51200000000, + 0x690cb5dc00000000, 0x679c3e7900000000, 0x342ad34c00000000, + 0x3aba58e900000000, 0x4bf2145300000000, 0x45629ff600000000, + 0x16d472c300000000, 0x1844f96600000000, 0xb0b8a9a800000000, + 0xbe28220d00000000, 0xed9ecf3800000000, 0xe30e449d00000000, + 0xfc611f7f00000000, 0xf2f194da00000000, 0xa14779ef00000000, + 0xafd7f24a00000000, 0x072ba28400000000, 0x09bb292100000000, + 0x5a0dc41400000000, 0x549d4fb100000000, 0xb3312aad00000000, + 0xbda1a10800000000, 0xee174c3d00000000, 0xe087c79800000000, + 0x487b975600000000, 0x46eb1cf300000000, 0x155df1c600000000, + 0x1bcd7a6300000000, 0x04a2218100000000, 0x0a32aa2400000000, + 0x5984471100000000, 0x5714ccb400000000, 0xffe89c7a00000000, + 0xf17817df00000000, 0xa2cefaea00000000, 0xac5e714f00000000, + 0xdd163df500000000, 0xd386b65000000000, 0x80305b6500000000, + 0x8ea0d0c000000000, 0x265c800e00000000, 0x28cc0bab00000000, + 0x7b7ae69e00000000, 0x75ea6d3b00000000, 0x6a8536d900000000, + 0x6415bd7c00000000, 0x37a3504900000000, 0x3933dbec00000000, + 0x91cf8b2200000000, 0x9f5f008700000000, 0xcce9edb200000000, + 0xc279661700000000, 0x6f7f041d00000000, 0x61ef8fb800000000, + 0x3259628d00000000, 0x3cc9e92800000000, 0x9435b9e600000000, + 0x9aa5324300000000, 0xc913df7600000000, 0xc78354d300000000, + 0xd8ec0f3100000000, 0xd67c849400000000, 0x85ca69a100000000, + 0x8b5ae20400000000, 0x23a6b2ca00000000, 0x2d36396f00000000, + 0x7e80d45a00000000, 0x70105fff00000000, 0x0158134500000000, + 0x0fc898e000000000, 0x5c7e75d500000000, 0x52eefe7000000000, + 0xfa12aebe00000000, 0xf482251b00000000, 0xa734c82e00000000, + 0xa9a4438b00000000, 0xb6cb186900000000, 0xb85b93cc00000000, + 0xebed7ef900000000, 0xe57df55c00000000, 0x4d81a59200000000, + 0x43112e3700000000, 0x10a7c30200000000, 0x1e3748a700000000, + 0x4aaa071600000000, 0x443a8cb300000000, 0x178c618600000000, + 0x191cea2300000000, 0xb1e0baed00000000, 0xbf70314800000000, + 0xecc6dc7d00000000, 0xe25657d800000000, 0xfd390c3a00000000, + 0xf3a9879f00000000, 0xa01f6aaa00000000, 0xae8fe10f00000000, + 0x0673b1c100000000, 0x08e33a6400000000, 0x5b55d75100000000, + 0x55c55cf400000000, 0x248d104e00000000, 0x2a1d9beb00000000, + 0x79ab76de00000000, 0x773bfd7b00000000, 0xdfc7adb500000000, + 0xd157261000000000, 0x82e1cb2500000000, 0x8c71408000000000, + 0x931e1b6200000000, 0x9d8e90c700000000, 0xce387df200000000, + 0xc0a8f65700000000, 0x6854a69900000000, 0x66c42d3c00000000, + 0x3572c00900000000, 0x3be24bac00000000, 0x96e429a600000000, + 0x9874a20300000000, 0xcbc24f3600000000, 0xc552c49300000000, + 0x6dae945d00000000, 0x633e1ff800000000, 0x3088f2cd00000000, + 0x3e18796800000000, 0x2177228a00000000, 0x2fe7a92f00000000, + 0x7c51441a00000000, 0x72c1cfbf00000000, 0xda3d9f7100000000, + 0xd4ad14d400000000, 0x871bf9e100000000, 0x898b724400000000, + 0xf8c33efe00000000, 0xf653b55b00000000, 0xa5e5586e00000000, + 0xab75d3cb00000000, 0x0389830500000000, 0x0d1908a000000000, + 0x5eafe59500000000, 0x503f6e3000000000, 0x4f5035d200000000, + 0x41c0be7700000000, 0x1276534200000000, 0x1ce6d8e700000000, + 0xb41a882900000000, 0xba8a038c00000000, 0xe93ceeb900000000, + 0xe7ac651c00000000}, + {0x0000000000000000, 0x97a61de700000000, 0x6f4b4a1500000000, + 0xf8ed57f200000000, 0xde96942a00000000, 0x493089cd00000000, + 0xb1ddde3f00000000, 0x267bc3d800000000, 0xbc2d295500000000, + 0x2b8b34b200000000, 0xd366634000000000, 0x44c07ea700000000, + 0x62bbbd7f00000000, 0xf51da09800000000, 0x0df0f76a00000000, + 0x9a56ea8d00000000, 0x785b52aa00000000, 0xeffd4f4d00000000, + 0x171018bf00000000, 0x80b6055800000000, 0xa6cdc68000000000, + 0x316bdb6700000000, 0xc9868c9500000000, 0x5e20917200000000, + 0xc4767bff00000000, 0x53d0661800000000, 0xab3d31ea00000000, + 0x3c9b2c0d00000000, 0x1ae0efd500000000, 0x8d46f23200000000, + 0x75aba5c000000000, 0xe20db82700000000, 0xb1b0d58f00000000, + 0x2616c86800000000, 0xdefb9f9a00000000, 0x495d827d00000000, + 0x6f2641a500000000, 0xf8805c4200000000, 0x006d0bb000000000, + 0x97cb165700000000, 0x0d9dfcda00000000, 0x9a3be13d00000000, + 0x62d6b6cf00000000, 0xf570ab2800000000, 0xd30b68f000000000, + 0x44ad751700000000, 0xbc4022e500000000, 0x2be63f0200000000, + 0xc9eb872500000000, 0x5e4d9ac200000000, 0xa6a0cd3000000000, + 0x3106d0d700000000, 0x177d130f00000000, 0x80db0ee800000000, + 0x7836591a00000000, 0xef9044fd00000000, 0x75c6ae7000000000, + 0xe260b39700000000, 0x1a8de46500000000, 0x8d2bf98200000000, + 0xab503a5a00000000, 0x3cf627bd00000000, 0xc41b704f00000000, + 0x53bd6da800000000, 0x2367dac400000000, 0xb4c1c72300000000, + 0x4c2c90d100000000, 0xdb8a8d3600000000, 0xfdf14eee00000000, + 0x6a57530900000000, 0x92ba04fb00000000, 0x051c191c00000000, + 0x9f4af39100000000, 0x08ecee7600000000, 0xf001b98400000000, + 0x67a7a46300000000, 0x41dc67bb00000000, 0xd67a7a5c00000000, + 0x2e972dae00000000, 0xb931304900000000, 0x5b3c886e00000000, + 0xcc9a958900000000, 0x3477c27b00000000, 0xa3d1df9c00000000, + 0x85aa1c4400000000, 0x120c01a300000000, 0xeae1565100000000, + 0x7d474bb600000000, 0xe711a13b00000000, 0x70b7bcdc00000000, + 0x885aeb2e00000000, 0x1ffcf6c900000000, 0x3987351100000000, + 0xae2128f600000000, 0x56cc7f0400000000, 0xc16a62e300000000, + 0x92d70f4b00000000, 0x057112ac00000000, 0xfd9c455e00000000, + 0x6a3a58b900000000, 0x4c419b6100000000, 0xdbe7868600000000, + 0x230ad17400000000, 0xb4accc9300000000, 0x2efa261e00000000, + 0xb95c3bf900000000, 0x41b16c0b00000000, 0xd61771ec00000000, + 0xf06cb23400000000, 0x67caafd300000000, 0x9f27f82100000000, + 0x0881e5c600000000, 0xea8c5de100000000, 0x7d2a400600000000, + 0x85c717f400000000, 0x12610a1300000000, 0x341ac9cb00000000, + 0xa3bcd42c00000000, 0x5b5183de00000000, 0xccf79e3900000000, + 0x56a174b400000000, 0xc107695300000000, 0x39ea3ea100000000, + 0xae4c234600000000, 0x8837e09e00000000, 0x1f91fd7900000000, + 0xe77caa8b00000000, 0x70dab76c00000000, 0x07c8c55200000000, + 0x906ed8b500000000, 0x68838f4700000000, 0xff2592a000000000, + 0xd95e517800000000, 0x4ef84c9f00000000, 0xb6151b6d00000000, + 0x21b3068a00000000, 0xbbe5ec0700000000, 0x2c43f1e000000000, + 0xd4aea61200000000, 0x4308bbf500000000, 0x6573782d00000000, + 0xf2d565ca00000000, 0x0a38323800000000, 0x9d9e2fdf00000000, + 0x7f9397f800000000, 0xe8358a1f00000000, 0x10d8dded00000000, + 0x877ec00a00000000, 0xa10503d200000000, 0x36a31e3500000000, + 0xce4e49c700000000, 0x59e8542000000000, 0xc3bebead00000000, + 0x5418a34a00000000, 0xacf5f4b800000000, 0x3b53e95f00000000, + 0x1d282a8700000000, 0x8a8e376000000000, 0x7263609200000000, + 0xe5c57d7500000000, 0xb67810dd00000000, 0x21de0d3a00000000, + 0xd9335ac800000000, 0x4e95472f00000000, 0x68ee84f700000000, + 0xff48991000000000, 0x07a5cee200000000, 0x9003d30500000000, + 0x0a55398800000000, 0x9df3246f00000000, 0x651e739d00000000, + 0xf2b86e7a00000000, 0xd4c3ada200000000, 0x4365b04500000000, + 0xbb88e7b700000000, 0x2c2efa5000000000, 0xce23427700000000, + 0x59855f9000000000, 0xa168086200000000, 0x36ce158500000000, + 0x10b5d65d00000000, 0x8713cbba00000000, 0x7ffe9c4800000000, + 0xe85881af00000000, 0x720e6b2200000000, 0xe5a876c500000000, + 0x1d45213700000000, 0x8ae33cd000000000, 0xac98ff0800000000, + 0x3b3ee2ef00000000, 0xc3d3b51d00000000, 0x5475a8fa00000000, + 0x24af1f9600000000, 0xb309027100000000, 0x4be4558300000000, + 0xdc42486400000000, 0xfa398bbc00000000, 0x6d9f965b00000000, + 0x9572c1a900000000, 0x02d4dc4e00000000, 0x988236c300000000, + 0x0f242b2400000000, 0xf7c97cd600000000, 0x606f613100000000, + 0x4614a2e900000000, 0xd1b2bf0e00000000, 0x295fe8fc00000000, + 0xbef9f51b00000000, 0x5cf44d3c00000000, 0xcb5250db00000000, + 0x33bf072900000000, 0xa4191ace00000000, 0x8262d91600000000, + 0x15c4c4f100000000, 0xed29930300000000, 0x7a8f8ee400000000, + 0xe0d9646900000000, 0x777f798e00000000, 0x8f922e7c00000000, + 0x1834339b00000000, 0x3e4ff04300000000, 0xa9e9eda400000000, + 0x5104ba5600000000, 0xc6a2a7b100000000, 0x951fca1900000000, + 0x02b9d7fe00000000, 0xfa54800c00000000, 0x6df29deb00000000, + 0x4b895e3300000000, 0xdc2f43d400000000, 0x24c2142600000000, + 0xb36409c100000000, 0x2932e34c00000000, 0xbe94feab00000000, + 0x4679a95900000000, 0xd1dfb4be00000000, 0xf7a4776600000000, + 0x60026a8100000000, 0x98ef3d7300000000, 0x0f49209400000000, + 0xed4498b300000000, 0x7ae2855400000000, 0x820fd2a600000000, + 0x15a9cf4100000000, 0x33d20c9900000000, 0xa474117e00000000, + 0x5c99468c00000000, 0xcb3f5b6b00000000, 0x5169b1e600000000, + 0xc6cfac0100000000, 0x3e22fbf300000000, 0xa984e61400000000, + 0x8fff25cc00000000, 0x1859382b00000000, 0xe0b46fd900000000, + 0x7712723e00000000}, + {0x0000000000000000, 0x411b8c6e00000000, 0x823618dd00000000, + 0xc32d94b300000000, 0x456b416100000000, 0x0470cd0f00000000, + 0xc75d59bc00000000, 0x8646d5d200000000, 0x8ad682c200000000, + 0xcbcd0eac00000000, 0x08e09a1f00000000, 0x49fb167100000000, + 0xcfbdc3a300000000, 0x8ea64fcd00000000, 0x4d8bdb7e00000000, + 0x0c90571000000000, 0x55ab745e00000000, 0x14b0f83000000000, + 0xd79d6c8300000000, 0x9686e0ed00000000, 0x10c0353f00000000, + 0x51dbb95100000000, 0x92f62de200000000, 0xd3eda18c00000000, + 0xdf7df69c00000000, 0x9e667af200000000, 0x5d4bee4100000000, + 0x1c50622f00000000, 0x9a16b7fd00000000, 0xdb0d3b9300000000, + 0x1820af2000000000, 0x593b234e00000000, 0xaa56e9bc00000000, + 0xeb4d65d200000000, 0x2860f16100000000, 0x697b7d0f00000000, + 0xef3da8dd00000000, 0xae2624b300000000, 0x6d0bb00000000000, + 0x2c103c6e00000000, 0x20806b7e00000000, 0x619be71000000000, + 0xa2b673a300000000, 0xe3adffcd00000000, 0x65eb2a1f00000000, + 0x24f0a67100000000, 0xe7dd32c200000000, 0xa6c6beac00000000, + 0xfffd9de200000000, 0xbee6118c00000000, 0x7dcb853f00000000, + 0x3cd0095100000000, 0xba96dc8300000000, 0xfb8d50ed00000000, + 0x38a0c45e00000000, 0x79bb483000000000, 0x752b1f2000000000, + 0x3430934e00000000, 0xf71d07fd00000000, 0xb6068b9300000000, + 0x30405e4100000000, 0x715bd22f00000000, 0xb276469c00000000, + 0xf36dcaf200000000, 0x15aba3a200000000, 0x54b02fcc00000000, + 0x979dbb7f00000000, 0xd686371100000000, 0x50c0e2c300000000, + 0x11db6ead00000000, 0xd2f6fa1e00000000, 0x93ed767000000000, + 0x9f7d216000000000, 0xde66ad0e00000000, 0x1d4b39bd00000000, + 0x5c50b5d300000000, 0xda16600100000000, 0x9b0dec6f00000000, + 0x582078dc00000000, 0x193bf4b200000000, 0x4000d7fc00000000, + 0x011b5b9200000000, 0xc236cf2100000000, 0x832d434f00000000, + 0x056b969d00000000, 0x44701af300000000, 0x875d8e4000000000, + 0xc646022e00000000, 0xcad6553e00000000, 0x8bcdd95000000000, + 0x48e04de300000000, 0x09fbc18d00000000, 0x8fbd145f00000000, + 0xcea6983100000000, 0x0d8b0c8200000000, 0x4c9080ec00000000, + 0xbffd4a1e00000000, 0xfee6c67000000000, 0x3dcb52c300000000, + 0x7cd0dead00000000, 0xfa960b7f00000000, 0xbb8d871100000000, + 0x78a013a200000000, 0x39bb9fcc00000000, 0x352bc8dc00000000, + 0x743044b200000000, 0xb71dd00100000000, 0xf6065c6f00000000, + 0x704089bd00000000, 0x315b05d300000000, 0xf276916000000000, + 0xb36d1d0e00000000, 0xea563e4000000000, 0xab4db22e00000000, + 0x6860269d00000000, 0x297baaf300000000, 0xaf3d7f2100000000, + 0xee26f34f00000000, 0x2d0b67fc00000000, 0x6c10eb9200000000, + 0x6080bc8200000000, 0x219b30ec00000000, 0xe2b6a45f00000000, + 0xa3ad283100000000, 0x25ebfde300000000, 0x64f0718d00000000, + 0xa7dde53e00000000, 0xe6c6695000000000, 0x6b50369e00000000, + 0x2a4bbaf000000000, 0xe9662e4300000000, 0xa87da22d00000000, + 0x2e3b77ff00000000, 0x6f20fb9100000000, 0xac0d6f2200000000, + 0xed16e34c00000000, 0xe186b45c00000000, 0xa09d383200000000, + 0x63b0ac8100000000, 0x22ab20ef00000000, 0xa4edf53d00000000, + 0xe5f6795300000000, 0x26dbede000000000, 0x67c0618e00000000, + 0x3efb42c000000000, 0x7fe0ceae00000000, 0xbccd5a1d00000000, + 0xfdd6d67300000000, 0x7b9003a100000000, 0x3a8b8fcf00000000, + 0xf9a61b7c00000000, 0xb8bd971200000000, 0xb42dc00200000000, + 0xf5364c6c00000000, 0x361bd8df00000000, 0x770054b100000000, + 0xf146816300000000, 0xb05d0d0d00000000, 0x737099be00000000, + 0x326b15d000000000, 0xc106df2200000000, 0x801d534c00000000, + 0x4330c7ff00000000, 0x022b4b9100000000, 0x846d9e4300000000, + 0xc576122d00000000, 0x065b869e00000000, 0x47400af000000000, + 0x4bd05de000000000, 0x0acbd18e00000000, 0xc9e6453d00000000, + 0x88fdc95300000000, 0x0ebb1c8100000000, 0x4fa090ef00000000, + 0x8c8d045c00000000, 0xcd96883200000000, 0x94adab7c00000000, + 0xd5b6271200000000, 0x169bb3a100000000, 0x57803fcf00000000, + 0xd1c6ea1d00000000, 0x90dd667300000000, 0x53f0f2c000000000, + 0x12eb7eae00000000, 0x1e7b29be00000000, 0x5f60a5d000000000, + 0x9c4d316300000000, 0xdd56bd0d00000000, 0x5b1068df00000000, + 0x1a0be4b100000000, 0xd926700200000000, 0x983dfc6c00000000, + 0x7efb953c00000000, 0x3fe0195200000000, 0xfccd8de100000000, + 0xbdd6018f00000000, 0x3b90d45d00000000, 0x7a8b583300000000, + 0xb9a6cc8000000000, 0xf8bd40ee00000000, 0xf42d17fe00000000, + 0xb5369b9000000000, 0x761b0f2300000000, 0x3700834d00000000, + 0xb146569f00000000, 0xf05ddaf100000000, 0x33704e4200000000, + 0x726bc22c00000000, 0x2b50e16200000000, 0x6a4b6d0c00000000, + 0xa966f9bf00000000, 0xe87d75d100000000, 0x6e3ba00300000000, + 0x2f202c6d00000000, 0xec0db8de00000000, 0xad1634b000000000, + 0xa18663a000000000, 0xe09defce00000000, 0x23b07b7d00000000, + 0x62abf71300000000, 0xe4ed22c100000000, 0xa5f6aeaf00000000, + 0x66db3a1c00000000, 0x27c0b67200000000, 0xd4ad7c8000000000, + 0x95b6f0ee00000000, 0x569b645d00000000, 0x1780e83300000000, + 0x91c63de100000000, 0xd0ddb18f00000000, 0x13f0253c00000000, + 0x52eba95200000000, 0x5e7bfe4200000000, 0x1f60722c00000000, + 0xdc4de69f00000000, 0x9d566af100000000, 0x1b10bf2300000000, + 0x5a0b334d00000000, 0x9926a7fe00000000, 0xd83d2b9000000000, + 0x810608de00000000, 0xc01d84b000000000, 0x0330100300000000, + 0x422b9c6d00000000, 0xc46d49bf00000000, 0x8576c5d100000000, + 0x465b516200000000, 0x0740dd0c00000000, 0x0bd08a1c00000000, + 0x4acb067200000000, 0x89e692c100000000, 0xc8fd1eaf00000000, + 0x4ebbcb7d00000000, 0x0fa0471300000000, 0xcc8dd3a000000000, + 0x8d965fce00000000}, + {0x0000000000000000, 0x1dfdb50100000000, 0x3afa6b0300000000, + 0x2707de0200000000, 0x74f4d70600000000, 0x6909620700000000, + 0x4e0ebc0500000000, 0x53f3090400000000, 0xe8e8af0d00000000, + 0xf5151a0c00000000, 0xd212c40e00000000, 0xcfef710f00000000, + 0x9c1c780b00000000, 0x81e1cd0a00000000, 0xa6e6130800000000, + 0xbb1ba60900000000, 0xd0d15f1b00000000, 0xcd2cea1a00000000, + 0xea2b341800000000, 0xf7d6811900000000, 0xa425881d00000000, + 0xb9d83d1c00000000, 0x9edfe31e00000000, 0x8322561f00000000, + 0x3839f01600000000, 0x25c4451700000000, 0x02c39b1500000000, + 0x1f3e2e1400000000, 0x4ccd271000000000, 0x5130921100000000, + 0x76374c1300000000, 0x6bcaf91200000000, 0xa0a3bf3600000000, + 0xbd5e0a3700000000, 0x9a59d43500000000, 0x87a4613400000000, + 0xd457683000000000, 0xc9aadd3100000000, 0xeead033300000000, + 0xf350b63200000000, 0x484b103b00000000, 0x55b6a53a00000000, + 0x72b17b3800000000, 0x6f4cce3900000000, 0x3cbfc73d00000000, + 0x2142723c00000000, 0x0645ac3e00000000, 0x1bb8193f00000000, + 0x7072e02d00000000, 0x6d8f552c00000000, 0x4a888b2e00000000, + 0x57753e2f00000000, 0x0486372b00000000, 0x197b822a00000000, + 0x3e7c5c2800000000, 0x2381e92900000000, 0x989a4f2000000000, + 0x8567fa2100000000, 0xa260242300000000, 0xbf9d912200000000, + 0xec6e982600000000, 0xf1932d2700000000, 0xd694f32500000000, + 0xcb69462400000000, 0x40477f6d00000000, 0x5dbaca6c00000000, + 0x7abd146e00000000, 0x6740a16f00000000, 0x34b3a86b00000000, + 0x294e1d6a00000000, 0x0e49c36800000000, 0x13b4766900000000, + 0xa8afd06000000000, 0xb552656100000000, 0x9255bb6300000000, + 0x8fa80e6200000000, 0xdc5b076600000000, 0xc1a6b26700000000, + 0xe6a16c6500000000, 0xfb5cd96400000000, 0x9096207600000000, + 0x8d6b957700000000, 0xaa6c4b7500000000, 0xb791fe7400000000, + 0xe462f77000000000, 0xf99f427100000000, 0xde989c7300000000, + 0xc365297200000000, 0x787e8f7b00000000, 0x65833a7a00000000, + 0x4284e47800000000, 0x5f79517900000000, 0x0c8a587d00000000, + 0x1177ed7c00000000, 0x3670337e00000000, 0x2b8d867f00000000, + 0xe0e4c05b00000000, 0xfd19755a00000000, 0xda1eab5800000000, + 0xc7e31e5900000000, 0x9410175d00000000, 0x89eda25c00000000, + 0xaeea7c5e00000000, 0xb317c95f00000000, 0x080c6f5600000000, + 0x15f1da5700000000, 0x32f6045500000000, 0x2f0bb15400000000, + 0x7cf8b85000000000, 0x61050d5100000000, 0x4602d35300000000, + 0x5bff665200000000, 0x30359f4000000000, 0x2dc82a4100000000, + 0x0acff44300000000, 0x1732414200000000, 0x44c1484600000000, + 0x593cfd4700000000, 0x7e3b234500000000, 0x63c6964400000000, + 0xd8dd304d00000000, 0xc520854c00000000, 0xe2275b4e00000000, + 0xffdaee4f00000000, 0xac29e74b00000000, 0xb1d4524a00000000, + 0x96d38c4800000000, 0x8b2e394900000000, 0x808efeda00000000, + 0x9d734bdb00000000, 0xba7495d900000000, 0xa78920d800000000, + 0xf47a29dc00000000, 0xe9879cdd00000000, 0xce8042df00000000, + 0xd37df7de00000000, 0x686651d700000000, 0x759be4d600000000, + 0x529c3ad400000000, 0x4f618fd500000000, 0x1c9286d100000000, + 0x016f33d000000000, 0x2668edd200000000, 0x3b9558d300000000, + 0x505fa1c100000000, 0x4da214c000000000, 0x6aa5cac200000000, + 0x77587fc300000000, 0x24ab76c700000000, 0x3956c3c600000000, + 0x1e511dc400000000, 0x03aca8c500000000, 0xb8b70ecc00000000, + 0xa54abbcd00000000, 0x824d65cf00000000, 0x9fb0d0ce00000000, + 0xcc43d9ca00000000, 0xd1be6ccb00000000, 0xf6b9b2c900000000, + 0xeb4407c800000000, 0x202d41ec00000000, 0x3dd0f4ed00000000, + 0x1ad72aef00000000, 0x072a9fee00000000, 0x54d996ea00000000, + 0x492423eb00000000, 0x6e23fde900000000, 0x73de48e800000000, + 0xc8c5eee100000000, 0xd5385be000000000, 0xf23f85e200000000, + 0xefc230e300000000, 0xbc3139e700000000, 0xa1cc8ce600000000, + 0x86cb52e400000000, 0x9b36e7e500000000, 0xf0fc1ef700000000, + 0xed01abf600000000, 0xca0675f400000000, 0xd7fbc0f500000000, + 0x8408c9f100000000, 0x99f57cf000000000, 0xbef2a2f200000000, + 0xa30f17f300000000, 0x1814b1fa00000000, 0x05e904fb00000000, + 0x22eedaf900000000, 0x3f136ff800000000, 0x6ce066fc00000000, + 0x711dd3fd00000000, 0x561a0dff00000000, 0x4be7b8fe00000000, + 0xc0c981b700000000, 0xdd3434b600000000, 0xfa33eab400000000, + 0xe7ce5fb500000000, 0xb43d56b100000000, 0xa9c0e3b000000000, + 0x8ec73db200000000, 0x933a88b300000000, 0x28212eba00000000, + 0x35dc9bbb00000000, 0x12db45b900000000, 0x0f26f0b800000000, + 0x5cd5f9bc00000000, 0x41284cbd00000000, 0x662f92bf00000000, + 0x7bd227be00000000, 0x1018deac00000000, 0x0de56bad00000000, + 0x2ae2b5af00000000, 0x371f00ae00000000, 0x64ec09aa00000000, + 0x7911bcab00000000, 0x5e1662a900000000, 0x43ebd7a800000000, + 0xf8f071a100000000, 0xe50dc4a000000000, 0xc20a1aa200000000, + 0xdff7afa300000000, 0x8c04a6a700000000, 0x91f913a600000000, + 0xb6fecda400000000, 0xab0378a500000000, 0x606a3e8100000000, + 0x7d978b8000000000, 0x5a90558200000000, 0x476de08300000000, + 0x149ee98700000000, 0x09635c8600000000, 0x2e64828400000000, + 0x3399378500000000, 0x8882918c00000000, 0x957f248d00000000, + 0xb278fa8f00000000, 0xaf854f8e00000000, 0xfc76468a00000000, + 0xe18bf38b00000000, 0xc68c2d8900000000, 0xdb71988800000000, + 0xb0bb619a00000000, 0xad46d49b00000000, 0x8a410a9900000000, + 0x97bcbf9800000000, 0xc44fb69c00000000, 0xd9b2039d00000000, + 0xfeb5dd9f00000000, 0xe348689e00000000, 0x5853ce9700000000, + 0x45ae7b9600000000, 0x62a9a59400000000, 0x7f54109500000000, + 0x2ca7199100000000, 0x315aac9000000000, 0x165d729200000000, + 0x0ba0c79300000000}, + {0x0000000000000000, 0x24d9076300000000, 0x48b20fc600000000, + 0x6c6b08a500000000, 0xd1626e5700000000, 0xf5bb693400000000, + 0x99d0619100000000, 0xbd0966f200000000, 0xa2c5dcae00000000, + 0x861cdbcd00000000, 0xea77d36800000000, 0xceaed40b00000000, + 0x73a7b2f900000000, 0x577eb59a00000000, 0x3b15bd3f00000000, + 0x1fccba5c00000000, 0x058dc88600000000, 0x2154cfe500000000, + 0x4d3fc74000000000, 0x69e6c02300000000, 0xd4efa6d100000000, + 0xf036a1b200000000, 0x9c5da91700000000, 0xb884ae7400000000, + 0xa748142800000000, 0x8391134b00000000, 0xeffa1bee00000000, + 0xcb231c8d00000000, 0x762a7a7f00000000, 0x52f37d1c00000000, + 0x3e9875b900000000, 0x1a4172da00000000, 0x4b1ce0d600000000, + 0x6fc5e7b500000000, 0x03aeef1000000000, 0x2777e87300000000, + 0x9a7e8e8100000000, 0xbea789e200000000, 0xd2cc814700000000, + 0xf615862400000000, 0xe9d93c7800000000, 0xcd003b1b00000000, + 0xa16b33be00000000, 0x85b234dd00000000, 0x38bb522f00000000, + 0x1c62554c00000000, 0x70095de900000000, 0x54d05a8a00000000, + 0x4e91285000000000, 0x6a482f3300000000, 0x0623279600000000, + 0x22fa20f500000000, 0x9ff3460700000000, 0xbb2a416400000000, + 0xd74149c100000000, 0xf3984ea200000000, 0xec54f4fe00000000, + 0xc88df39d00000000, 0xa4e6fb3800000000, 0x803ffc5b00000000, + 0x3d369aa900000000, 0x19ef9dca00000000, 0x7584956f00000000, + 0x515d920c00000000, 0xd73eb17600000000, 0xf3e7b61500000000, + 0x9f8cbeb000000000, 0xbb55b9d300000000, 0x065cdf2100000000, + 0x2285d84200000000, 0x4eeed0e700000000, 0x6a37d78400000000, + 0x75fb6dd800000000, 0x51226abb00000000, 0x3d49621e00000000, + 0x1990657d00000000, 0xa499038f00000000, 0x804004ec00000000, + 0xec2b0c4900000000, 0xc8f20b2a00000000, 0xd2b379f000000000, + 0xf66a7e9300000000, 0x9a01763600000000, 0xbed8715500000000, + 0x03d117a700000000, 0x270810c400000000, 0x4b63186100000000, + 0x6fba1f0200000000, 0x7076a55e00000000, 0x54afa23d00000000, + 0x38c4aa9800000000, 0x1c1dadfb00000000, 0xa114cb0900000000, + 0x85cdcc6a00000000, 0xe9a6c4cf00000000, 0xcd7fc3ac00000000, + 0x9c2251a000000000, 0xb8fb56c300000000, 0xd4905e6600000000, + 0xf049590500000000, 0x4d403ff700000000, 0x6999389400000000, + 0x05f2303100000000, 0x212b375200000000, 0x3ee78d0e00000000, + 0x1a3e8a6d00000000, 0x765582c800000000, 0x528c85ab00000000, + 0xef85e35900000000, 0xcb5ce43a00000000, 0xa737ec9f00000000, + 0x83eeebfc00000000, 0x99af992600000000, 0xbd769e4500000000, + 0xd11d96e000000000, 0xf5c4918300000000, 0x48cdf77100000000, + 0x6c14f01200000000, 0x007ff8b700000000, 0x24a6ffd400000000, + 0x3b6a458800000000, 0x1fb342eb00000000, 0x73d84a4e00000000, + 0x57014d2d00000000, 0xea082bdf00000000, 0xced12cbc00000000, + 0xa2ba241900000000, 0x8663237a00000000, 0xae7d62ed00000000, + 0x8aa4658e00000000, 0xe6cf6d2b00000000, 0xc2166a4800000000, + 0x7f1f0cba00000000, 0x5bc60bd900000000, 0x37ad037c00000000, + 0x1374041f00000000, 0x0cb8be4300000000, 0x2861b92000000000, + 0x440ab18500000000, 0x60d3b6e600000000, 0xdddad01400000000, + 0xf903d77700000000, 0x9568dfd200000000, 0xb1b1d8b100000000, + 0xabf0aa6b00000000, 0x8f29ad0800000000, 0xe342a5ad00000000, + 0xc79ba2ce00000000, 0x7a92c43c00000000, 0x5e4bc35f00000000, + 0x3220cbfa00000000, 0x16f9cc9900000000, 0x093576c500000000, + 0x2dec71a600000000, 0x4187790300000000, 0x655e7e6000000000, + 0xd857189200000000, 0xfc8e1ff100000000, 0x90e5175400000000, + 0xb43c103700000000, 0xe561823b00000000, 0xc1b8855800000000, + 0xadd38dfd00000000, 0x890a8a9e00000000, 0x3403ec6c00000000, + 0x10daeb0f00000000, 0x7cb1e3aa00000000, 0x5868e4c900000000, + 0x47a45e9500000000, 0x637d59f600000000, 0x0f16515300000000, + 0x2bcf563000000000, 0x96c630c200000000, 0xb21f37a100000000, + 0xde743f0400000000, 0xfaad386700000000, 0xe0ec4abd00000000, + 0xc4354dde00000000, 0xa85e457b00000000, 0x8c87421800000000, + 0x318e24ea00000000, 0x1557238900000000, 0x793c2b2c00000000, + 0x5de52c4f00000000, 0x4229961300000000, 0x66f0917000000000, + 0x0a9b99d500000000, 0x2e429eb600000000, 0x934bf84400000000, + 0xb792ff2700000000, 0xdbf9f78200000000, 0xff20f0e100000000, + 0x7943d39b00000000, 0x5d9ad4f800000000, 0x31f1dc5d00000000, + 0x1528db3e00000000, 0xa821bdcc00000000, 0x8cf8baaf00000000, + 0xe093b20a00000000, 0xc44ab56900000000, 0xdb860f3500000000, + 0xff5f085600000000, 0x933400f300000000, 0xb7ed079000000000, + 0x0ae4616200000000, 0x2e3d660100000000, 0x42566ea400000000, + 0x668f69c700000000, 0x7cce1b1d00000000, 0x58171c7e00000000, + 0x347c14db00000000, 0x10a513b800000000, 0xadac754a00000000, + 0x8975722900000000, 0xe51e7a8c00000000, 0xc1c77def00000000, + 0xde0bc7b300000000, 0xfad2c0d000000000, 0x96b9c87500000000, + 0xb260cf1600000000, 0x0f69a9e400000000, 0x2bb0ae8700000000, + 0x47dba62200000000, 0x6302a14100000000, 0x325f334d00000000, + 0x1686342e00000000, 0x7aed3c8b00000000, 0x5e343be800000000, + 0xe33d5d1a00000000, 0xc7e45a7900000000, 0xab8f52dc00000000, + 0x8f5655bf00000000, 0x909aefe300000000, 0xb443e88000000000, + 0xd828e02500000000, 0xfcf1e74600000000, 0x41f881b400000000, + 0x652186d700000000, 0x094a8e7200000000, 0x2d93891100000000, + 0x37d2fbcb00000000, 0x130bfca800000000, 0x7f60f40d00000000, + 0x5bb9f36e00000000, 0xe6b0959c00000000, 0xc26992ff00000000, + 0xae029a5a00000000, 0x8adb9d3900000000, 0x9517276500000000, + 0xb1ce200600000000, 0xdda528a300000000, 0xf97c2fc000000000, + 0x4475493200000000, 0x60ac4e5100000000, 0x0cc746f400000000, + 0x281e419700000000}, + {0x0000000000000000, 0x08e3603c00000000, 0x10c6c17800000000, + 0x1825a14400000000, 0x208c83f100000000, 0x286fe3cd00000000, + 0x304a428900000000, 0x38a922b500000000, 0x011e763800000000, + 0x09fd160400000000, 0x11d8b74000000000, 0x193bd77c00000000, + 0x2192f5c900000000, 0x297195f500000000, 0x315434b100000000, + 0x39b7548d00000000, 0x023cec7000000000, 0x0adf8c4c00000000, + 0x12fa2d0800000000, 0x1a194d3400000000, 0x22b06f8100000000, + 0x2a530fbd00000000, 0x3276aef900000000, 0x3a95cec500000000, + 0x03229a4800000000, 0x0bc1fa7400000000, 0x13e45b3000000000, + 0x1b073b0c00000000, 0x23ae19b900000000, 0x2b4d798500000000, + 0x3368d8c100000000, 0x3b8bb8fd00000000, 0x0478d8e100000000, + 0x0c9bb8dd00000000, 0x14be199900000000, 0x1c5d79a500000000, + 0x24f45b1000000000, 0x2c173b2c00000000, 0x34329a6800000000, + 0x3cd1fa5400000000, 0x0566aed900000000, 0x0d85cee500000000, + 0x15a06fa100000000, 0x1d430f9d00000000, 0x25ea2d2800000000, + 0x2d094d1400000000, 0x352cec5000000000, 0x3dcf8c6c00000000, + 0x0644349100000000, 0x0ea754ad00000000, 0x1682f5e900000000, + 0x1e6195d500000000, 0x26c8b76000000000, 0x2e2bd75c00000000, + 0x360e761800000000, 0x3eed162400000000, 0x075a42a900000000, + 0x0fb9229500000000, 0x179c83d100000000, 0x1f7fe3ed00000000, + 0x27d6c15800000000, 0x2f35a16400000000, 0x3710002000000000, + 0x3ff3601c00000000, 0x49f6c11800000000, 0x4115a12400000000, + 0x5930006000000000, 0x51d3605c00000000, 0x697a42e900000000, + 0x619922d500000000, 0x79bc839100000000, 0x715fe3ad00000000, + 0x48e8b72000000000, 0x400bd71c00000000, 0x582e765800000000, + 0x50cd166400000000, 0x686434d100000000, 0x608754ed00000000, + 0x78a2f5a900000000, 0x7041959500000000, 0x4bca2d6800000000, + 0x43294d5400000000, 0x5b0cec1000000000, 0x53ef8c2c00000000, + 0x6b46ae9900000000, 0x63a5cea500000000, 0x7b806fe100000000, + 0x73630fdd00000000, 0x4ad45b5000000000, 0x42373b6c00000000, + 0x5a129a2800000000, 0x52f1fa1400000000, 0x6a58d8a100000000, + 0x62bbb89d00000000, 0x7a9e19d900000000, 0x727d79e500000000, + 0x4d8e19f900000000, 0x456d79c500000000, 0x5d48d88100000000, + 0x55abb8bd00000000, 0x6d029a0800000000, 0x65e1fa3400000000, + 0x7dc45b7000000000, 0x75273b4c00000000, 0x4c906fc100000000, + 0x44730ffd00000000, 0x5c56aeb900000000, 0x54b5ce8500000000, + 0x6c1cec3000000000, 0x64ff8c0c00000000, 0x7cda2d4800000000, + 0x74394d7400000000, 0x4fb2f58900000000, 0x475195b500000000, + 0x5f7434f100000000, 0x579754cd00000000, 0x6f3e767800000000, + 0x67dd164400000000, 0x7ff8b70000000000, 0x771bd73c00000000, + 0x4eac83b100000000, 0x464fe38d00000000, 0x5e6a42c900000000, + 0x568922f500000000, 0x6e20004000000000, 0x66c3607c00000000, + 0x7ee6c13800000000, 0x7605a10400000000, 0x92ec833100000000, + 0x9a0fe30d00000000, 0x822a424900000000, 0x8ac9227500000000, + 0xb26000c000000000, 0xba8360fc00000000, 0xa2a6c1b800000000, + 0xaa45a18400000000, 0x93f2f50900000000, 0x9b11953500000000, + 0x8334347100000000, 0x8bd7544d00000000, 0xb37e76f800000000, + 0xbb9d16c400000000, 0xa3b8b78000000000, 0xab5bd7bc00000000, + 0x90d06f4100000000, 0x98330f7d00000000, 0x8016ae3900000000, + 0x88f5ce0500000000, 0xb05cecb000000000, 0xb8bf8c8c00000000, + 0xa09a2dc800000000, 0xa8794df400000000, 0x91ce197900000000, + 0x992d794500000000, 0x8108d80100000000, 0x89ebb83d00000000, + 0xb1429a8800000000, 0xb9a1fab400000000, 0xa1845bf000000000, + 0xa9673bcc00000000, 0x96945bd000000000, 0x9e773bec00000000, + 0x86529aa800000000, 0x8eb1fa9400000000, 0xb618d82100000000, + 0xbefbb81d00000000, 0xa6de195900000000, 0xae3d796500000000, + 0x978a2de800000000, 0x9f694dd400000000, 0x874cec9000000000, + 0x8faf8cac00000000, 0xb706ae1900000000, 0xbfe5ce2500000000, + 0xa7c06f6100000000, 0xaf230f5d00000000, 0x94a8b7a000000000, + 0x9c4bd79c00000000, 0x846e76d800000000, 0x8c8d16e400000000, + 0xb424345100000000, 0xbcc7546d00000000, 0xa4e2f52900000000, + 0xac01951500000000, 0x95b6c19800000000, 0x9d55a1a400000000, + 0x857000e000000000, 0x8d9360dc00000000, 0xb53a426900000000, + 0xbdd9225500000000, 0xa5fc831100000000, 0xad1fe32d00000000, + 0xdb1a422900000000, 0xd3f9221500000000, 0xcbdc835100000000, + 0xc33fe36d00000000, 0xfb96c1d800000000, 0xf375a1e400000000, + 0xeb5000a000000000, 0xe3b3609c00000000, 0xda04341100000000, + 0xd2e7542d00000000, 0xcac2f56900000000, 0xc221955500000000, + 0xfa88b7e000000000, 0xf26bd7dc00000000, 0xea4e769800000000, + 0xe2ad16a400000000, 0xd926ae5900000000, 0xd1c5ce6500000000, + 0xc9e06f2100000000, 0xc1030f1d00000000, 0xf9aa2da800000000, + 0xf1494d9400000000, 0xe96cecd000000000, 0xe18f8cec00000000, + 0xd838d86100000000, 0xd0dbb85d00000000, 0xc8fe191900000000, + 0xc01d792500000000, 0xf8b45b9000000000, 0xf0573bac00000000, + 0xe8729ae800000000, 0xe091fad400000000, 0xdf629ac800000000, + 0xd781faf400000000, 0xcfa45bb000000000, 0xc7473b8c00000000, + 0xffee193900000000, 0xf70d790500000000, 0xef28d84100000000, + 0xe7cbb87d00000000, 0xde7cecf000000000, 0xd69f8ccc00000000, + 0xceba2d8800000000, 0xc6594db400000000, 0xfef06f0100000000, + 0xf6130f3d00000000, 0xee36ae7900000000, 0xe6d5ce4500000000, + 0xdd5e76b800000000, 0xd5bd168400000000, 0xcd98b7c000000000, + 0xc57bd7fc00000000, 0xfdd2f54900000000, 0xf531957500000000, + 0xed14343100000000, 0xe5f7540d00000000, 0xdc40008000000000, + 0xd4a360bc00000000, 0xcc86c1f800000000, 0xc465a1c400000000, + 0xfccc837100000000, 0xf42fe34d00000000, 0xec0a420900000000, + 0xe4e9223500000000}, + {0x0000000000000000, 0xd1e8e70e00000000, 0xa2d1cf1d00000000, + 0x7339281300000000, 0x44a39f3b00000000, 0x954b783500000000, + 0xe672502600000000, 0x379ab72800000000, 0x88463f7700000000, + 0x59aed87900000000, 0x2a97f06a00000000, 0xfb7f176400000000, + 0xcce5a04c00000000, 0x1d0d474200000000, 0x6e346f5100000000, + 0xbfdc885f00000000, 0x108d7eee00000000, 0xc16599e000000000, + 0xb25cb1f300000000, 0x63b456fd00000000, 0x542ee1d500000000, + 0x85c606db00000000, 0xf6ff2ec800000000, 0x2717c9c600000000, + 0x98cb419900000000, 0x4923a69700000000, 0x3a1a8e8400000000, + 0xebf2698a00000000, 0xdc68dea200000000, 0x0d8039ac00000000, + 0x7eb911bf00000000, 0xaf51f6b100000000, 0x611c8c0700000000, + 0xb0f46b0900000000, 0xc3cd431a00000000, 0x1225a41400000000, + 0x25bf133c00000000, 0xf457f43200000000, 0x876edc2100000000, + 0x56863b2f00000000, 0xe95ab37000000000, 0x38b2547e00000000, + 0x4b8b7c6d00000000, 0x9a639b6300000000, 0xadf92c4b00000000, + 0x7c11cb4500000000, 0x0f28e35600000000, 0xdec0045800000000, + 0x7191f2e900000000, 0xa07915e700000000, 0xd3403df400000000, + 0x02a8dafa00000000, 0x35326dd200000000, 0xe4da8adc00000000, + 0x97e3a2cf00000000, 0x460b45c100000000, 0xf9d7cd9e00000000, + 0x283f2a9000000000, 0x5b06028300000000, 0x8aeee58d00000000, + 0xbd7452a500000000, 0x6c9cb5ab00000000, 0x1fa59db800000000, + 0xce4d7ab600000000, 0xc238180f00000000, 0x13d0ff0100000000, + 0x60e9d71200000000, 0xb101301c00000000, 0x869b873400000000, + 0x5773603a00000000, 0x244a482900000000, 0xf5a2af2700000000, + 0x4a7e277800000000, 0x9b96c07600000000, 0xe8afe86500000000, + 0x39470f6b00000000, 0x0eddb84300000000, 0xdf355f4d00000000, + 0xac0c775e00000000, 0x7de4905000000000, 0xd2b566e100000000, + 0x035d81ef00000000, 0x7064a9fc00000000, 0xa18c4ef200000000, + 0x9616f9da00000000, 0x47fe1ed400000000, 0x34c736c700000000, + 0xe52fd1c900000000, 0x5af3599600000000, 0x8b1bbe9800000000, + 0xf822968b00000000, 0x29ca718500000000, 0x1e50c6ad00000000, + 0xcfb821a300000000, 0xbc8109b000000000, 0x6d69eebe00000000, + 0xa324940800000000, 0x72cc730600000000, 0x01f55b1500000000, + 0xd01dbc1b00000000, 0xe7870b3300000000, 0x366fec3d00000000, + 0x4556c42e00000000, 0x94be232000000000, 0x2b62ab7f00000000, + 0xfa8a4c7100000000, 0x89b3646200000000, 0x585b836c00000000, + 0x6fc1344400000000, 0xbe29d34a00000000, 0xcd10fb5900000000, + 0x1cf81c5700000000, 0xb3a9eae600000000, 0x62410de800000000, + 0x117825fb00000000, 0xc090c2f500000000, 0xf70a75dd00000000, + 0x26e292d300000000, 0x55dbbac000000000, 0x84335dce00000000, + 0x3befd59100000000, 0xea07329f00000000, 0x993e1a8c00000000, + 0x48d6fd8200000000, 0x7f4c4aaa00000000, 0xaea4ada400000000, + 0xdd9d85b700000000, 0x0c7562b900000000, 0x8471301e00000000, + 0x5599d71000000000, 0x26a0ff0300000000, 0xf748180d00000000, + 0xc0d2af2500000000, 0x113a482b00000000, 0x6203603800000000, + 0xb3eb873600000000, 0x0c370f6900000000, 0xdddfe86700000000, + 0xaee6c07400000000, 0x7f0e277a00000000, 0x4894905200000000, + 0x997c775c00000000, 0xea455f4f00000000, 0x3badb84100000000, + 0x94fc4ef000000000, 0x4514a9fe00000000, 0x362d81ed00000000, + 0xe7c566e300000000, 0xd05fd1cb00000000, 0x01b736c500000000, + 0x728e1ed600000000, 0xa366f9d800000000, 0x1cba718700000000, + 0xcd52968900000000, 0xbe6bbe9a00000000, 0x6f83599400000000, + 0x5819eebc00000000, 0x89f109b200000000, 0xfac821a100000000, + 0x2b20c6af00000000, 0xe56dbc1900000000, 0x34855b1700000000, + 0x47bc730400000000, 0x9654940a00000000, 0xa1ce232200000000, + 0x7026c42c00000000, 0x031fec3f00000000, 0xd2f70b3100000000, + 0x6d2b836e00000000, 0xbcc3646000000000, 0xcffa4c7300000000, + 0x1e12ab7d00000000, 0x29881c5500000000, 0xf860fb5b00000000, + 0x8b59d34800000000, 0x5ab1344600000000, 0xf5e0c2f700000000, + 0x240825f900000000, 0x57310dea00000000, 0x86d9eae400000000, + 0xb1435dcc00000000, 0x60abbac200000000, 0x139292d100000000, + 0xc27a75df00000000, 0x7da6fd8000000000, 0xac4e1a8e00000000, + 0xdf77329d00000000, 0x0e9fd59300000000, 0x390562bb00000000, + 0xe8ed85b500000000, 0x9bd4ada600000000, 0x4a3c4aa800000000, + 0x4649281100000000, 0x97a1cf1f00000000, 0xe498e70c00000000, + 0x3570000200000000, 0x02eab72a00000000, 0xd302502400000000, + 0xa03b783700000000, 0x71d39f3900000000, 0xce0f176600000000, + 0x1fe7f06800000000, 0x6cded87b00000000, 0xbd363f7500000000, + 0x8aac885d00000000, 0x5b446f5300000000, 0x287d474000000000, + 0xf995a04e00000000, 0x56c456ff00000000, 0x872cb1f100000000, + 0xf41599e200000000, 0x25fd7eec00000000, 0x1267c9c400000000, + 0xc38f2eca00000000, 0xb0b606d900000000, 0x615ee1d700000000, + 0xde82698800000000, 0x0f6a8e8600000000, 0x7c53a69500000000, + 0xadbb419b00000000, 0x9a21f6b300000000, 0x4bc911bd00000000, + 0x38f039ae00000000, 0xe918dea000000000, 0x2755a41600000000, + 0xf6bd431800000000, 0x85846b0b00000000, 0x546c8c0500000000, + 0x63f63b2d00000000, 0xb21edc2300000000, 0xc127f43000000000, + 0x10cf133e00000000, 0xaf139b6100000000, 0x7efb7c6f00000000, + 0x0dc2547c00000000, 0xdc2ab37200000000, 0xebb0045a00000000, + 0x3a58e35400000000, 0x4961cb4700000000, 0x98892c4900000000, + 0x37d8daf800000000, 0xe6303df600000000, 0x950915e500000000, + 0x44e1f2eb00000000, 0x737b45c300000000, 0xa293a2cd00000000, + 0xd1aa8ade00000000, 0x00426dd000000000, 0xbf9ee58f00000000, + 0x6e76028100000000, 0x1d4f2a9200000000, 0xcca7cd9c00000000, + 0xfb3d7ab400000000, 0x2ad59dba00000000, 0x59ecb5a900000000, + 0x880452a700000000}, + {0x0000000000000000, 0xaa05daf100000000, 0x150dc53800000000, + 0xbf081fc900000000, 0x2a1a8a7100000000, 0x801f508000000000, + 0x3f174f4900000000, 0x951295b800000000, 0x543414e300000000, + 0xfe31ce1200000000, 0x4139d1db00000000, 0xeb3c0b2a00000000, + 0x7e2e9e9200000000, 0xd42b446300000000, 0x6b235baa00000000, + 0xc126815b00000000, 0xe96e591d00000000, 0x436b83ec00000000, + 0xfc639c2500000000, 0x566646d400000000, 0xc374d36c00000000, + 0x6971099d00000000, 0xd679165400000000, 0x7c7ccca500000000, + 0xbd5a4dfe00000000, 0x175f970f00000000, 0xa85788c600000000, + 0x0252523700000000, 0x9740c78f00000000, 0x3d451d7e00000000, + 0x824d02b700000000, 0x2848d84600000000, 0xd2ddb23a00000000, + 0x78d868cb00000000, 0xc7d0770200000000, 0x6dd5adf300000000, + 0xf8c7384b00000000, 0x52c2e2ba00000000, 0xedcafd7300000000, + 0x47cf278200000000, 0x86e9a6d900000000, 0x2cec7c2800000000, + 0x93e463e100000000, 0x39e1b91000000000, 0xacf32ca800000000, + 0x06f6f65900000000, 0xb9fee99000000000, 0x13fb336100000000, + 0x3bb3eb2700000000, 0x91b631d600000000, 0x2ebe2e1f00000000, + 0x84bbf4ee00000000, 0x11a9615600000000, 0xbbacbba700000000, + 0x04a4a46e00000000, 0xaea17e9f00000000, 0x6f87ffc400000000, + 0xc582253500000000, 0x7a8a3afc00000000, 0xd08fe00d00000000, + 0x459d75b500000000, 0xef98af4400000000, 0x5090b08d00000000, + 0xfa956a7c00000000, 0xa4bb657500000000, 0x0ebebf8400000000, + 0xb1b6a04d00000000, 0x1bb37abc00000000, 0x8ea1ef0400000000, + 0x24a435f500000000, 0x9bac2a3c00000000, 0x31a9f0cd00000000, + 0xf08f719600000000, 0x5a8aab6700000000, 0xe582b4ae00000000, + 0x4f876e5f00000000, 0xda95fbe700000000, 0x7090211600000000, + 0xcf983edf00000000, 0x659de42e00000000, 0x4dd53c6800000000, + 0xe7d0e69900000000, 0x58d8f95000000000, 0xf2dd23a100000000, + 0x67cfb61900000000, 0xcdca6ce800000000, 0x72c2732100000000, + 0xd8c7a9d000000000, 0x19e1288b00000000, 0xb3e4f27a00000000, + 0x0cecedb300000000, 0xa6e9374200000000, 0x33fba2fa00000000, + 0x99fe780b00000000, 0x26f667c200000000, 0x8cf3bd3300000000, + 0x7666d74f00000000, 0xdc630dbe00000000, 0x636b127700000000, + 0xc96ec88600000000, 0x5c7c5d3e00000000, 0xf67987cf00000000, + 0x4971980600000000, 0xe37442f700000000, 0x2252c3ac00000000, + 0x8857195d00000000, 0x375f069400000000, 0x9d5adc6500000000, + 0x084849dd00000000, 0xa24d932c00000000, 0x1d458ce500000000, + 0xb740561400000000, 0x9f088e5200000000, 0x350d54a300000000, + 0x8a054b6a00000000, 0x2000919b00000000, 0xb512042300000000, + 0x1f17ded200000000, 0xa01fc11b00000000, 0x0a1a1bea00000000, + 0xcb3c9ab100000000, 0x6139404000000000, 0xde315f8900000000, + 0x7434857800000000, 0xe12610c000000000, 0x4b23ca3100000000, + 0xf42bd5f800000000, 0x5e2e0f0900000000, 0x4877cbea00000000, + 0xe272111b00000000, 0x5d7a0ed200000000, 0xf77fd42300000000, + 0x626d419b00000000, 0xc8689b6a00000000, 0x776084a300000000, + 0xdd655e5200000000, 0x1c43df0900000000, 0xb64605f800000000, + 0x094e1a3100000000, 0xa34bc0c000000000, 0x3659557800000000, + 0x9c5c8f8900000000, 0x2354904000000000, 0x89514ab100000000, + 0xa11992f700000000, 0x0b1c480600000000, 0xb41457cf00000000, + 0x1e118d3e00000000, 0x8b03188600000000, 0x2106c27700000000, + 0x9e0eddbe00000000, 0x340b074f00000000, 0xf52d861400000000, + 0x5f285ce500000000, 0xe020432c00000000, 0x4a2599dd00000000, + 0xdf370c6500000000, 0x7532d69400000000, 0xca3ac95d00000000, + 0x603f13ac00000000, 0x9aaa79d000000000, 0x30afa32100000000, + 0x8fa7bce800000000, 0x25a2661900000000, 0xb0b0f3a100000000, + 0x1ab5295000000000, 0xa5bd369900000000, 0x0fb8ec6800000000, + 0xce9e6d3300000000, 0x649bb7c200000000, 0xdb93a80b00000000, + 0x719672fa00000000, 0xe484e74200000000, 0x4e813db300000000, + 0xf189227a00000000, 0x5b8cf88b00000000, 0x73c420cd00000000, + 0xd9c1fa3c00000000, 0x66c9e5f500000000, 0xcccc3f0400000000, + 0x59deaabc00000000, 0xf3db704d00000000, 0x4cd36f8400000000, + 0xe6d6b57500000000, 0x27f0342e00000000, 0x8df5eedf00000000, + 0x32fdf11600000000, 0x98f82be700000000, 0x0deabe5f00000000, + 0xa7ef64ae00000000, 0x18e77b6700000000, 0xb2e2a19600000000, + 0xecccae9f00000000, 0x46c9746e00000000, 0xf9c16ba700000000, + 0x53c4b15600000000, 0xc6d624ee00000000, 0x6cd3fe1f00000000, + 0xd3dbe1d600000000, 0x79de3b2700000000, 0xb8f8ba7c00000000, + 0x12fd608d00000000, 0xadf57f4400000000, 0x07f0a5b500000000, + 0x92e2300d00000000, 0x38e7eafc00000000, 0x87eff53500000000, + 0x2dea2fc400000000, 0x05a2f78200000000, 0xafa72d7300000000, + 0x10af32ba00000000, 0xbaaae84b00000000, 0x2fb87df300000000, + 0x85bda70200000000, 0x3ab5b8cb00000000, 0x90b0623a00000000, + 0x5196e36100000000, 0xfb93399000000000, 0x449b265900000000, + 0xee9efca800000000, 0x7b8c691000000000, 0xd189b3e100000000, + 0x6e81ac2800000000, 0xc48476d900000000, 0x3e111ca500000000, + 0x9414c65400000000, 0x2b1cd99d00000000, 0x8119036c00000000, + 0x140b96d400000000, 0xbe0e4c2500000000, 0x010653ec00000000, + 0xab03891d00000000, 0x6a25084600000000, 0xc020d2b700000000, + 0x7f28cd7e00000000, 0xd52d178f00000000, 0x403f823700000000, + 0xea3a58c600000000, 0x5532470f00000000, 0xff379dfe00000000, + 0xd77f45b800000000, 0x7d7a9f4900000000, 0xc272808000000000, + 0x68775a7100000000, 0xfd65cfc900000000, 0x5760153800000000, + 0xe8680af100000000, 0x426dd00000000000, 0x834b515b00000000, + 0x294e8baa00000000, 0x9646946300000000, 0x3c434e9200000000, + 0xa951db2a00000000, 0x035401db00000000, 0xbc5c1e1200000000, + 0x1659c4e300000000}}; + +#else /* W == 4 */ + +local const z_crc_t FAR crc_braid_table[][256] = { + {0x00000000, 0xae689191, 0x87a02563, 0x29c8b4f2, 0xd4314c87, + 0x7a59dd16, 0x539169e4, 0xfdf9f875, 0x73139f4f, 0xdd7b0ede, + 0xf4b3ba2c, 0x5adb2bbd, 0xa722d3c8, 0x094a4259, 0x2082f6ab, + 0x8eea673a, 0xe6273e9e, 0x484faf0f, 0x61871bfd, 0xcfef8a6c, + 0x32167219, 0x9c7ee388, 0xb5b6577a, 0x1bdec6eb, 0x9534a1d1, + 0x3b5c3040, 0x129484b2, 0xbcfc1523, 0x4105ed56, 0xef6d7cc7, + 0xc6a5c835, 0x68cd59a4, 0x173f7b7d, 0xb957eaec, 0x909f5e1e, + 0x3ef7cf8f, 0xc30e37fa, 0x6d66a66b, 0x44ae1299, 0xeac68308, + 0x642ce432, 0xca4475a3, 0xe38cc151, 0x4de450c0, 0xb01da8b5, + 0x1e753924, 0x37bd8dd6, 0x99d51c47, 0xf11845e3, 0x5f70d472, + 0x76b86080, 0xd8d0f111, 0x25290964, 0x8b4198f5, 0xa2892c07, + 0x0ce1bd96, 0x820bdaac, 0x2c634b3d, 0x05abffcf, 0xabc36e5e, + 0x563a962b, 0xf85207ba, 0xd19ab348, 0x7ff222d9, 0x2e7ef6fa, + 0x8016676b, 0xa9ded399, 0x07b64208, 0xfa4fba7d, 0x54272bec, + 0x7def9f1e, 0xd3870e8f, 0x5d6d69b5, 0xf305f824, 0xdacd4cd6, + 0x74a5dd47, 0x895c2532, 0x2734b4a3, 0x0efc0051, 0xa09491c0, + 0xc859c864, 0x663159f5, 0x4ff9ed07, 0xe1917c96, 0x1c6884e3, + 0xb2001572, 0x9bc8a180, 0x35a03011, 0xbb4a572b, 0x1522c6ba, + 0x3cea7248, 0x9282e3d9, 0x6f7b1bac, 0xc1138a3d, 0xe8db3ecf, + 0x46b3af5e, 0x39418d87, 0x97291c16, 0xbee1a8e4, 0x10893975, + 0xed70c100, 0x43185091, 0x6ad0e463, 0xc4b875f2, 0x4a5212c8, + 0xe43a8359, 0xcdf237ab, 0x639aa63a, 0x9e635e4f, 0x300bcfde, + 0x19c37b2c, 0xb7abeabd, 0xdf66b319, 0x710e2288, 0x58c6967a, + 0xf6ae07eb, 0x0b57ff9e, 0xa53f6e0f, 0x8cf7dafd, 0x229f4b6c, + 0xac752c56, 0x021dbdc7, 0x2bd50935, 0x85bd98a4, 0x784460d1, + 0xd62cf140, 0xffe445b2, 0x518cd423, 0x5cfdedf4, 0xf2957c65, + 0xdb5dc897, 0x75355906, 0x88cca173, 0x26a430e2, 0x0f6c8410, + 0xa1041581, 0x2fee72bb, 0x8186e32a, 0xa84e57d8, 0x0626c649, + 0xfbdf3e3c, 0x55b7afad, 0x7c7f1b5f, 0xd2178ace, 0xbadad36a, + 0x14b242fb, 0x3d7af609, 0x93126798, 0x6eeb9fed, 0xc0830e7c, + 0xe94bba8e, 0x47232b1f, 0xc9c94c25, 0x67a1ddb4, 0x4e696946, + 0xe001f8d7, 0x1df800a2, 0xb3909133, 0x9a5825c1, 0x3430b450, + 0x4bc29689, 0xe5aa0718, 0xcc62b3ea, 0x620a227b, 0x9ff3da0e, + 0x319b4b9f, 0x1853ff6d, 0xb63b6efc, 0x38d109c6, 0x96b99857, + 0xbf712ca5, 0x1119bd34, 0xece04541, 0x4288d4d0, 0x6b406022, + 0xc528f1b3, 0xade5a817, 0x038d3986, 0x2a458d74, 0x842d1ce5, + 0x79d4e490, 0xd7bc7501, 0xfe74c1f3, 0x501c5062, 0xdef63758, + 0x709ea6c9, 0x5956123b, 0xf73e83aa, 0x0ac77bdf, 0xa4afea4e, + 0x8d675ebc, 0x230fcf2d, 0x72831b0e, 0xdceb8a9f, 0xf5233e6d, + 0x5b4baffc, 0xa6b25789, 0x08dac618, 0x211272ea, 0x8f7ae37b, + 0x01908441, 0xaff815d0, 0x8630a122, 0x285830b3, 0xd5a1c8c6, + 0x7bc95957, 0x5201eda5, 0xfc697c34, 0x94a42590, 0x3accb401, + 0x130400f3, 0xbd6c9162, 0x40956917, 0xeefdf886, 0xc7354c74, + 0x695ddde5, 0xe7b7badf, 0x49df2b4e, 0x60179fbc, 0xce7f0e2d, + 0x3386f658, 0x9dee67c9, 0xb426d33b, 0x1a4e42aa, 0x65bc6073, + 0xcbd4f1e2, 0xe21c4510, 0x4c74d481, 0xb18d2cf4, 0x1fe5bd65, + 0x362d0997, 0x98459806, 0x16afff3c, 0xb8c76ead, 0x910fda5f, + 0x3f674bce, 0xc29eb3bb, 0x6cf6222a, 0x453e96d8, 0xeb560749, + 0x839b5eed, 0x2df3cf7c, 0x043b7b8e, 0xaa53ea1f, 0x57aa126a, + 0xf9c283fb, 0xd00a3709, 0x7e62a698, 0xf088c1a2, 0x5ee05033, + 0x7728e4c1, 0xd9407550, 0x24b98d25, 0x8ad11cb4, 0xa319a846, + 0x0d7139d7}, + {0x00000000, 0xb9fbdbe8, 0xa886b191, 0x117d6a79, 0x8a7c6563, + 0x3387be8b, 0x22fad4f2, 0x9b010f1a, 0xcf89cc87, 0x7672176f, + 0x670f7d16, 0xdef4a6fe, 0x45f5a9e4, 0xfc0e720c, 0xed731875, + 0x5488c39d, 0x44629f4f, 0xfd9944a7, 0xece42ede, 0x551ff536, + 0xce1efa2c, 0x77e521c4, 0x66984bbd, 0xdf639055, 0x8beb53c8, + 0x32108820, 0x236de259, 0x9a9639b1, 0x019736ab, 0xb86ced43, + 0xa911873a, 0x10ea5cd2, 0x88c53e9e, 0x313ee576, 0x20438f0f, + 0x99b854e7, 0x02b95bfd, 0xbb428015, 0xaa3fea6c, 0x13c43184, + 0x474cf219, 0xfeb729f1, 0xefca4388, 0x56319860, 0xcd30977a, + 0x74cb4c92, 0x65b626eb, 0xdc4dfd03, 0xcca7a1d1, 0x755c7a39, + 0x64211040, 0xdddacba8, 0x46dbc4b2, 0xff201f5a, 0xee5d7523, + 0x57a6aecb, 0x032e6d56, 0xbad5b6be, 0xaba8dcc7, 0x1253072f, + 0x89520835, 0x30a9d3dd, 0x21d4b9a4, 0x982f624c, 0xcafb7b7d, + 0x7300a095, 0x627dcaec, 0xdb861104, 0x40871e1e, 0xf97cc5f6, + 0xe801af8f, 0x51fa7467, 0x0572b7fa, 0xbc896c12, 0xadf4066b, + 0x140fdd83, 0x8f0ed299, 0x36f50971, 0x27886308, 0x9e73b8e0, + 0x8e99e432, 0x37623fda, 0x261f55a3, 0x9fe48e4b, 0x04e58151, + 0xbd1e5ab9, 0xac6330c0, 0x1598eb28, 0x411028b5, 0xf8ebf35d, + 0xe9969924, 0x506d42cc, 0xcb6c4dd6, 0x7297963e, 0x63eafc47, + 0xda1127af, 0x423e45e3, 0xfbc59e0b, 0xeab8f472, 0x53432f9a, + 0xc8422080, 0x71b9fb68, 0x60c49111, 0xd93f4af9, 0x8db78964, + 0x344c528c, 0x253138f5, 0x9ccae31d, 0x07cbec07, 0xbe3037ef, + 0xaf4d5d96, 0x16b6867e, 0x065cdaac, 0xbfa70144, 0xaeda6b3d, + 0x1721b0d5, 0x8c20bfcf, 0x35db6427, 0x24a60e5e, 0x9d5dd5b6, + 0xc9d5162b, 0x702ecdc3, 0x6153a7ba, 0xd8a87c52, 0x43a97348, + 0xfa52a8a0, 0xeb2fc2d9, 0x52d41931, 0x4e87f0bb, 0xf77c2b53, + 0xe601412a, 0x5ffa9ac2, 0xc4fb95d8, 0x7d004e30, 0x6c7d2449, + 0xd586ffa1, 0x810e3c3c, 0x38f5e7d4, 0x29888dad, 0x90735645, + 0x0b72595f, 0xb28982b7, 0xa3f4e8ce, 0x1a0f3326, 0x0ae56ff4, + 0xb31eb41c, 0xa263de65, 0x1b98058d, 0x80990a97, 0x3962d17f, + 0x281fbb06, 0x91e460ee, 0xc56ca373, 0x7c97789b, 0x6dea12e2, + 0xd411c90a, 0x4f10c610, 0xf6eb1df8, 0xe7967781, 0x5e6dac69, + 0xc642ce25, 0x7fb915cd, 0x6ec47fb4, 0xd73fa45c, 0x4c3eab46, + 0xf5c570ae, 0xe4b81ad7, 0x5d43c13f, 0x09cb02a2, 0xb030d94a, + 0xa14db333, 0x18b668db, 0x83b767c1, 0x3a4cbc29, 0x2b31d650, + 0x92ca0db8, 0x8220516a, 0x3bdb8a82, 0x2aa6e0fb, 0x935d3b13, + 0x085c3409, 0xb1a7efe1, 0xa0da8598, 0x19215e70, 0x4da99ded, + 0xf4524605, 0xe52f2c7c, 0x5cd4f794, 0xc7d5f88e, 0x7e2e2366, + 0x6f53491f, 0xd6a892f7, 0x847c8bc6, 0x3d87502e, 0x2cfa3a57, + 0x9501e1bf, 0x0e00eea5, 0xb7fb354d, 0xa6865f34, 0x1f7d84dc, + 0x4bf54741, 0xf20e9ca9, 0xe373f6d0, 0x5a882d38, 0xc1892222, + 0x7872f9ca, 0x690f93b3, 0xd0f4485b, 0xc01e1489, 0x79e5cf61, + 0x6898a518, 0xd1637ef0, 0x4a6271ea, 0xf399aa02, 0xe2e4c07b, + 0x5b1f1b93, 0x0f97d80e, 0xb66c03e6, 0xa711699f, 0x1eeab277, + 0x85ebbd6d, 0x3c106685, 0x2d6d0cfc, 0x9496d714, 0x0cb9b558, + 0xb5426eb0, 0xa43f04c9, 0x1dc4df21, 0x86c5d03b, 0x3f3e0bd3, + 0x2e4361aa, 0x97b8ba42, 0xc33079df, 0x7acba237, 0x6bb6c84e, + 0xd24d13a6, 0x494c1cbc, 0xf0b7c754, 0xe1caad2d, 0x583176c5, + 0x48db2a17, 0xf120f1ff, 0xe05d9b86, 0x59a6406e, 0xc2a74f74, + 0x7b5c949c, 0x6a21fee5, 0xd3da250d, 0x8752e690, 0x3ea93d78, + 0x2fd45701, 0x962f8ce9, 0x0d2e83f3, 0xb4d5581b, 0xa5a83262, + 0x1c53e98a}, + {0x00000000, 0x9d0fe176, 0xe16ec4ad, 0x7c6125db, 0x19ac8f1b, + 0x84a36e6d, 0xf8c24bb6, 0x65cdaac0, 0x33591e36, 0xae56ff40, + 0xd237da9b, 0x4f383bed, 0x2af5912d, 0xb7fa705b, 0xcb9b5580, + 0x5694b4f6, 0x66b23c6c, 0xfbbddd1a, 0x87dcf8c1, 0x1ad319b7, + 0x7f1eb377, 0xe2115201, 0x9e7077da, 0x037f96ac, 0x55eb225a, + 0xc8e4c32c, 0xb485e6f7, 0x298a0781, 0x4c47ad41, 0xd1484c37, + 0xad2969ec, 0x3026889a, 0xcd6478d8, 0x506b99ae, 0x2c0abc75, + 0xb1055d03, 0xd4c8f7c3, 0x49c716b5, 0x35a6336e, 0xa8a9d218, + 0xfe3d66ee, 0x63328798, 0x1f53a243, 0x825c4335, 0xe791e9f5, + 0x7a9e0883, 0x06ff2d58, 0x9bf0cc2e, 0xabd644b4, 0x36d9a5c2, + 0x4ab88019, 0xd7b7616f, 0xb27acbaf, 0x2f752ad9, 0x53140f02, + 0xce1bee74, 0x988f5a82, 0x0580bbf4, 0x79e19e2f, 0xe4ee7f59, + 0x8123d599, 0x1c2c34ef, 0x604d1134, 0xfd42f042, 0x41b9f7f1, + 0xdcb61687, 0xa0d7335c, 0x3dd8d22a, 0x581578ea, 0xc51a999c, + 0xb97bbc47, 0x24745d31, 0x72e0e9c7, 0xefef08b1, 0x938e2d6a, + 0x0e81cc1c, 0x6b4c66dc, 0xf64387aa, 0x8a22a271, 0x172d4307, + 0x270bcb9d, 0xba042aeb, 0xc6650f30, 0x5b6aee46, 0x3ea74486, + 0xa3a8a5f0, 0xdfc9802b, 0x42c6615d, 0x1452d5ab, 0x895d34dd, + 0xf53c1106, 0x6833f070, 0x0dfe5ab0, 0x90f1bbc6, 0xec909e1d, + 0x719f7f6b, 0x8cdd8f29, 0x11d26e5f, 0x6db34b84, 0xf0bcaaf2, + 0x95710032, 0x087ee144, 0x741fc49f, 0xe91025e9, 0xbf84911f, + 0x228b7069, 0x5eea55b2, 0xc3e5b4c4, 0xa6281e04, 0x3b27ff72, + 0x4746daa9, 0xda493bdf, 0xea6fb345, 0x77605233, 0x0b0177e8, + 0x960e969e, 0xf3c33c5e, 0x6eccdd28, 0x12adf8f3, 0x8fa21985, + 0xd936ad73, 0x44394c05, 0x385869de, 0xa55788a8, 0xc09a2268, + 0x5d95c31e, 0x21f4e6c5, 0xbcfb07b3, 0x8373efe2, 0x1e7c0e94, + 0x621d2b4f, 0xff12ca39, 0x9adf60f9, 0x07d0818f, 0x7bb1a454, + 0xe6be4522, 0xb02af1d4, 0x2d2510a2, 0x51443579, 0xcc4bd40f, + 0xa9867ecf, 0x34899fb9, 0x48e8ba62, 0xd5e75b14, 0xe5c1d38e, + 0x78ce32f8, 0x04af1723, 0x99a0f655, 0xfc6d5c95, 0x6162bde3, + 0x1d039838, 0x800c794e, 0xd698cdb8, 0x4b972cce, 0x37f60915, + 0xaaf9e863, 0xcf3442a3, 0x523ba3d5, 0x2e5a860e, 0xb3556778, + 0x4e17973a, 0xd318764c, 0xaf795397, 0x3276b2e1, 0x57bb1821, + 0xcab4f957, 0xb6d5dc8c, 0x2bda3dfa, 0x7d4e890c, 0xe041687a, + 0x9c204da1, 0x012facd7, 0x64e20617, 0xf9ede761, 0x858cc2ba, + 0x188323cc, 0x28a5ab56, 0xb5aa4a20, 0xc9cb6ffb, 0x54c48e8d, + 0x3109244d, 0xac06c53b, 0xd067e0e0, 0x4d680196, 0x1bfcb560, + 0x86f35416, 0xfa9271cd, 0x679d90bb, 0x02503a7b, 0x9f5fdb0d, + 0xe33efed6, 0x7e311fa0, 0xc2ca1813, 0x5fc5f965, 0x23a4dcbe, + 0xbeab3dc8, 0xdb669708, 0x4669767e, 0x3a0853a5, 0xa707b2d3, + 0xf1930625, 0x6c9ce753, 0x10fdc288, 0x8df223fe, 0xe83f893e, + 0x75306848, 0x09514d93, 0x945eace5, 0xa478247f, 0x3977c509, + 0x4516e0d2, 0xd81901a4, 0xbdd4ab64, 0x20db4a12, 0x5cba6fc9, + 0xc1b58ebf, 0x97213a49, 0x0a2edb3f, 0x764ffee4, 0xeb401f92, + 0x8e8db552, 0x13825424, 0x6fe371ff, 0xf2ec9089, 0x0fae60cb, + 0x92a181bd, 0xeec0a466, 0x73cf4510, 0x1602efd0, 0x8b0d0ea6, + 0xf76c2b7d, 0x6a63ca0b, 0x3cf77efd, 0xa1f89f8b, 0xdd99ba50, + 0x40965b26, 0x255bf1e6, 0xb8541090, 0xc435354b, 0x593ad43d, + 0x691c5ca7, 0xf413bdd1, 0x8872980a, 0x157d797c, 0x70b0d3bc, + 0xedbf32ca, 0x91de1711, 0x0cd1f667, 0x5a454291, 0xc74aa3e7, + 0xbb2b863c, 0x2624674a, 0x43e9cd8a, 0xdee62cfc, 0xa2870927, + 0x3f88e851}, + {0x00000000, 0xdd96d985, 0x605cb54b, 0xbdca6cce, 0xc0b96a96, + 0x1d2fb313, 0xa0e5dfdd, 0x7d730658, 0x5a03d36d, 0x87950ae8, + 0x3a5f6626, 0xe7c9bfa3, 0x9abab9fb, 0x472c607e, 0xfae60cb0, + 0x2770d535, 0xb407a6da, 0x69917f5f, 0xd45b1391, 0x09cdca14, + 0x74becc4c, 0xa92815c9, 0x14e27907, 0xc974a082, 0xee0475b7, + 0x3392ac32, 0x8e58c0fc, 0x53ce1979, 0x2ebd1f21, 0xf32bc6a4, + 0x4ee1aa6a, 0x937773ef, 0xb37e4bf5, 0x6ee89270, 0xd322febe, + 0x0eb4273b, 0x73c72163, 0xae51f8e6, 0x139b9428, 0xce0d4dad, + 0xe97d9898, 0x34eb411d, 0x89212dd3, 0x54b7f456, 0x29c4f20e, + 0xf4522b8b, 0x49984745, 0x940e9ec0, 0x0779ed2f, 0xdaef34aa, + 0x67255864, 0xbab381e1, 0xc7c087b9, 0x1a565e3c, 0xa79c32f2, + 0x7a0aeb77, 0x5d7a3e42, 0x80ece7c7, 0x3d268b09, 0xe0b0528c, + 0x9dc354d4, 0x40558d51, 0xfd9fe19f, 0x2009381a, 0xbd8d91ab, + 0x601b482e, 0xddd124e0, 0x0047fd65, 0x7d34fb3d, 0xa0a222b8, + 0x1d684e76, 0xc0fe97f3, 0xe78e42c6, 0x3a189b43, 0x87d2f78d, + 0x5a442e08, 0x27372850, 0xfaa1f1d5, 0x476b9d1b, 0x9afd449e, + 0x098a3771, 0xd41ceef4, 0x69d6823a, 0xb4405bbf, 0xc9335de7, + 0x14a58462, 0xa96fe8ac, 0x74f93129, 0x5389e41c, 0x8e1f3d99, + 0x33d55157, 0xee4388d2, 0x93308e8a, 0x4ea6570f, 0xf36c3bc1, + 0x2efae244, 0x0ef3da5e, 0xd36503db, 0x6eaf6f15, 0xb339b690, + 0xce4ab0c8, 0x13dc694d, 0xae160583, 0x7380dc06, 0x54f00933, + 0x8966d0b6, 0x34acbc78, 0xe93a65fd, 0x944963a5, 0x49dfba20, + 0xf415d6ee, 0x29830f6b, 0xbaf47c84, 0x6762a501, 0xdaa8c9cf, + 0x073e104a, 0x7a4d1612, 0xa7dbcf97, 0x1a11a359, 0xc7877adc, + 0xe0f7afe9, 0x3d61766c, 0x80ab1aa2, 0x5d3dc327, 0x204ec57f, + 0xfdd81cfa, 0x40127034, 0x9d84a9b1, 0xa06a2517, 0x7dfcfc92, + 0xc036905c, 0x1da049d9, 0x60d34f81, 0xbd459604, 0x008ffaca, + 0xdd19234f, 0xfa69f67a, 0x27ff2fff, 0x9a354331, 0x47a39ab4, + 0x3ad09cec, 0xe7464569, 0x5a8c29a7, 0x871af022, 0x146d83cd, + 0xc9fb5a48, 0x74313686, 0xa9a7ef03, 0xd4d4e95b, 0x094230de, + 0xb4885c10, 0x691e8595, 0x4e6e50a0, 0x93f88925, 0x2e32e5eb, + 0xf3a43c6e, 0x8ed73a36, 0x5341e3b3, 0xee8b8f7d, 0x331d56f8, + 0x13146ee2, 0xce82b767, 0x7348dba9, 0xaede022c, 0xd3ad0474, + 0x0e3bddf1, 0xb3f1b13f, 0x6e6768ba, 0x4917bd8f, 0x9481640a, + 0x294b08c4, 0xf4ddd141, 0x89aed719, 0x54380e9c, 0xe9f26252, + 0x3464bbd7, 0xa713c838, 0x7a8511bd, 0xc74f7d73, 0x1ad9a4f6, + 0x67aaa2ae, 0xba3c7b2b, 0x07f617e5, 0xda60ce60, 0xfd101b55, + 0x2086c2d0, 0x9d4cae1e, 0x40da779b, 0x3da971c3, 0xe03fa846, + 0x5df5c488, 0x80631d0d, 0x1de7b4bc, 0xc0716d39, 0x7dbb01f7, + 0xa02dd872, 0xdd5ede2a, 0x00c807af, 0xbd026b61, 0x6094b2e4, + 0x47e467d1, 0x9a72be54, 0x27b8d29a, 0xfa2e0b1f, 0x875d0d47, + 0x5acbd4c2, 0xe701b80c, 0x3a976189, 0xa9e01266, 0x7476cbe3, + 0xc9bca72d, 0x142a7ea8, 0x695978f0, 0xb4cfa175, 0x0905cdbb, + 0xd493143e, 0xf3e3c10b, 0x2e75188e, 0x93bf7440, 0x4e29adc5, + 0x335aab9d, 0xeecc7218, 0x53061ed6, 0x8e90c753, 0xae99ff49, + 0x730f26cc, 0xcec54a02, 0x13539387, 0x6e2095df, 0xb3b64c5a, + 0x0e7c2094, 0xd3eaf911, 0xf49a2c24, 0x290cf5a1, 0x94c6996f, + 0x495040ea, 0x342346b2, 0xe9b59f37, 0x547ff3f9, 0x89e92a7c, + 0x1a9e5993, 0xc7088016, 0x7ac2ecd8, 0xa754355d, 0xda273305, + 0x07b1ea80, 0xba7b864e, 0x67ed5fcb, 0x409d8afe, 0x9d0b537b, + 0x20c13fb5, 0xfd57e630, 0x8024e068, 0x5db239ed, 0xe0785523, + 0x3dee8ca6}}; + +local const z_word_t FAR crc_braid_big_table[][256] = { + {0x00000000, 0x85d996dd, 0x4bb55c60, 0xce6ccabd, 0x966ab9c0, + 0x13b32f1d, 0xdddfe5a0, 0x5806737d, 0x6dd3035a, 0xe80a9587, + 0x26665f3a, 0xa3bfc9e7, 0xfbb9ba9a, 0x7e602c47, 0xb00ce6fa, + 0x35d57027, 0xdaa607b4, 0x5f7f9169, 0x91135bd4, 0x14cacd09, + 0x4cccbe74, 0xc91528a9, 0x0779e214, 0x82a074c9, 0xb77504ee, + 0x32ac9233, 0xfcc0588e, 0x7919ce53, 0x211fbd2e, 0xa4c62bf3, + 0x6aaae14e, 0xef737793, 0xf54b7eb3, 0x7092e86e, 0xbefe22d3, + 0x3b27b40e, 0x6321c773, 0xe6f851ae, 0x28949b13, 0xad4d0dce, + 0x98987de9, 0x1d41eb34, 0xd32d2189, 0x56f4b754, 0x0ef2c429, + 0x8b2b52f4, 0x45479849, 0xc09e0e94, 0x2fed7907, 0xaa34efda, + 0x64582567, 0xe181b3ba, 0xb987c0c7, 0x3c5e561a, 0xf2329ca7, + 0x77eb0a7a, 0x423e7a5d, 0xc7e7ec80, 0x098b263d, 0x8c52b0e0, + 0xd454c39d, 0x518d5540, 0x9fe19ffd, 0x1a380920, 0xab918dbd, + 0x2e481b60, 0xe024d1dd, 0x65fd4700, 0x3dfb347d, 0xb822a2a0, + 0x764e681d, 0xf397fec0, 0xc6428ee7, 0x439b183a, 0x8df7d287, + 0x082e445a, 0x50283727, 0xd5f1a1fa, 0x1b9d6b47, 0x9e44fd9a, + 0x71378a09, 0xf4ee1cd4, 0x3a82d669, 0xbf5b40b4, 0xe75d33c9, + 0x6284a514, 0xace86fa9, 0x2931f974, 0x1ce48953, 0x993d1f8e, + 0x5751d533, 0xd28843ee, 0x8a8e3093, 0x0f57a64e, 0xc13b6cf3, + 0x44e2fa2e, 0x5edaf30e, 0xdb0365d3, 0x156faf6e, 0x90b639b3, + 0xc8b04ace, 0x4d69dc13, 0x830516ae, 0x06dc8073, 0x3309f054, + 0xb6d06689, 0x78bcac34, 0xfd653ae9, 0xa5634994, 0x20badf49, + 0xeed615f4, 0x6b0f8329, 0x847cf4ba, 0x01a56267, 0xcfc9a8da, + 0x4a103e07, 0x12164d7a, 0x97cfdba7, 0x59a3111a, 0xdc7a87c7, + 0xe9aff7e0, 0x6c76613d, 0xa21aab80, 0x27c33d5d, 0x7fc54e20, + 0xfa1cd8fd, 0x34701240, 0xb1a9849d, 0x17256aa0, 0x92fcfc7d, + 0x5c9036c0, 0xd949a01d, 0x814fd360, 0x049645bd, 0xcafa8f00, + 0x4f2319dd, 0x7af669fa, 0xff2fff27, 0x3143359a, 0xb49aa347, + 0xec9cd03a, 0x694546e7, 0xa7298c5a, 0x22f01a87, 0xcd836d14, + 0x485afbc9, 0x86363174, 0x03efa7a9, 0x5be9d4d4, 0xde304209, + 0x105c88b4, 0x95851e69, 0xa0506e4e, 0x2589f893, 0xebe5322e, + 0x6e3ca4f3, 0x363ad78e, 0xb3e34153, 0x7d8f8bee, 0xf8561d33, + 0xe26e1413, 0x67b782ce, 0xa9db4873, 0x2c02deae, 0x7404add3, + 0xf1dd3b0e, 0x3fb1f1b3, 0xba68676e, 0x8fbd1749, 0x0a648194, + 0xc4084b29, 0x41d1ddf4, 0x19d7ae89, 0x9c0e3854, 0x5262f2e9, + 0xd7bb6434, 0x38c813a7, 0xbd11857a, 0x737d4fc7, 0xf6a4d91a, + 0xaea2aa67, 0x2b7b3cba, 0xe517f607, 0x60ce60da, 0x551b10fd, + 0xd0c28620, 0x1eae4c9d, 0x9b77da40, 0xc371a93d, 0x46a83fe0, + 0x88c4f55d, 0x0d1d6380, 0xbcb4e71d, 0x396d71c0, 0xf701bb7d, + 0x72d82da0, 0x2ade5edd, 0xaf07c800, 0x616b02bd, 0xe4b29460, + 0xd167e447, 0x54be729a, 0x9ad2b827, 0x1f0b2efa, 0x470d5d87, + 0xc2d4cb5a, 0x0cb801e7, 0x8961973a, 0x6612e0a9, 0xe3cb7674, + 0x2da7bcc9, 0xa87e2a14, 0xf0785969, 0x75a1cfb4, 0xbbcd0509, + 0x3e1493d4, 0x0bc1e3f3, 0x8e18752e, 0x4074bf93, 0xc5ad294e, + 0x9dab5a33, 0x1872ccee, 0xd61e0653, 0x53c7908e, 0x49ff99ae, + 0xcc260f73, 0x024ac5ce, 0x87935313, 0xdf95206e, 0x5a4cb6b3, + 0x94207c0e, 0x11f9ead3, 0x242c9af4, 0xa1f50c29, 0x6f99c694, + 0xea405049, 0xb2462334, 0x379fb5e9, 0xf9f37f54, 0x7c2ae989, + 0x93599e1a, 0x168008c7, 0xd8ecc27a, 0x5d3554a7, 0x053327da, + 0x80eab107, 0x4e867bba, 0xcb5fed67, 0xfe8a9d40, 0x7b530b9d, + 0xb53fc120, 0x30e657fd, 0x68e02480, 0xed39b25d, 0x235578e0, + 0xa68cee3d}, + {0x00000000, 0x76e10f9d, 0xadc46ee1, 0xdb25617c, 0x1b8fac19, + 0x6d6ea384, 0xb64bc2f8, 0xc0aacd65, 0x361e5933, 0x40ff56ae, + 0x9bda37d2, 0xed3b384f, 0x2d91f52a, 0x5b70fab7, 0x80559bcb, + 0xf6b49456, 0x6c3cb266, 0x1addbdfb, 0xc1f8dc87, 0xb719d31a, + 0x77b31e7f, 0x015211e2, 0xda77709e, 0xac967f03, 0x5a22eb55, + 0x2cc3e4c8, 0xf7e685b4, 0x81078a29, 0x41ad474c, 0x374c48d1, + 0xec6929ad, 0x9a882630, 0xd87864cd, 0xae996b50, 0x75bc0a2c, + 0x035d05b1, 0xc3f7c8d4, 0xb516c749, 0x6e33a635, 0x18d2a9a8, + 0xee663dfe, 0x98873263, 0x43a2531f, 0x35435c82, 0xf5e991e7, + 0x83089e7a, 0x582dff06, 0x2eccf09b, 0xb444d6ab, 0xc2a5d936, + 0x1980b84a, 0x6f61b7d7, 0xafcb7ab2, 0xd92a752f, 0x020f1453, + 0x74ee1bce, 0x825a8f98, 0xf4bb8005, 0x2f9ee179, 0x597feee4, + 0x99d52381, 0xef342c1c, 0x34114d60, 0x42f042fd, 0xf1f7b941, + 0x8716b6dc, 0x5c33d7a0, 0x2ad2d83d, 0xea781558, 0x9c991ac5, + 0x47bc7bb9, 0x315d7424, 0xc7e9e072, 0xb108efef, 0x6a2d8e93, + 0x1ccc810e, 0xdc664c6b, 0xaa8743f6, 0x71a2228a, 0x07432d17, + 0x9dcb0b27, 0xeb2a04ba, 0x300f65c6, 0x46ee6a5b, 0x8644a73e, + 0xf0a5a8a3, 0x2b80c9df, 0x5d61c642, 0xabd55214, 0xdd345d89, + 0x06113cf5, 0x70f03368, 0xb05afe0d, 0xc6bbf190, 0x1d9e90ec, + 0x6b7f9f71, 0x298fdd8c, 0x5f6ed211, 0x844bb36d, 0xf2aabcf0, + 0x32007195, 0x44e17e08, 0x9fc41f74, 0xe92510e9, 0x1f9184bf, + 0x69708b22, 0xb255ea5e, 0xc4b4e5c3, 0x041e28a6, 0x72ff273b, + 0xa9da4647, 0xdf3b49da, 0x45b36fea, 0x33526077, 0xe877010b, + 0x9e960e96, 0x5e3cc3f3, 0x28ddcc6e, 0xf3f8ad12, 0x8519a28f, + 0x73ad36d9, 0x054c3944, 0xde695838, 0xa88857a5, 0x68229ac0, + 0x1ec3955d, 0xc5e6f421, 0xb307fbbc, 0xe2ef7383, 0x940e7c1e, + 0x4f2b1d62, 0x39ca12ff, 0xf960df9a, 0x8f81d007, 0x54a4b17b, + 0x2245bee6, 0xd4f12ab0, 0xa210252d, 0x79354451, 0x0fd44bcc, + 0xcf7e86a9, 0xb99f8934, 0x62bae848, 0x145be7d5, 0x8ed3c1e5, + 0xf832ce78, 0x2317af04, 0x55f6a099, 0x955c6dfc, 0xe3bd6261, + 0x3898031d, 0x4e790c80, 0xb8cd98d6, 0xce2c974b, 0x1509f637, + 0x63e8f9aa, 0xa34234cf, 0xd5a33b52, 0x0e865a2e, 0x786755b3, + 0x3a97174e, 0x4c7618d3, 0x975379af, 0xe1b27632, 0x2118bb57, + 0x57f9b4ca, 0x8cdcd5b6, 0xfa3dda2b, 0x0c894e7d, 0x7a6841e0, + 0xa14d209c, 0xd7ac2f01, 0x1706e264, 0x61e7edf9, 0xbac28c85, + 0xcc238318, 0x56aba528, 0x204aaab5, 0xfb6fcbc9, 0x8d8ec454, + 0x4d240931, 0x3bc506ac, 0xe0e067d0, 0x9601684d, 0x60b5fc1b, + 0x1654f386, 0xcd7192fa, 0xbb909d67, 0x7b3a5002, 0x0ddb5f9f, + 0xd6fe3ee3, 0xa01f317e, 0x1318cac2, 0x65f9c55f, 0xbedca423, + 0xc83dabbe, 0x089766db, 0x7e766946, 0xa553083a, 0xd3b207a7, + 0x250693f1, 0x53e79c6c, 0x88c2fd10, 0xfe23f28d, 0x3e893fe8, + 0x48683075, 0x934d5109, 0xe5ac5e94, 0x7f2478a4, 0x09c57739, + 0xd2e01645, 0xa40119d8, 0x64abd4bd, 0x124adb20, 0xc96fba5c, + 0xbf8eb5c1, 0x493a2197, 0x3fdb2e0a, 0xe4fe4f76, 0x921f40eb, + 0x52b58d8e, 0x24548213, 0xff71e36f, 0x8990ecf2, 0xcb60ae0f, + 0xbd81a192, 0x66a4c0ee, 0x1045cf73, 0xd0ef0216, 0xa60e0d8b, + 0x7d2b6cf7, 0x0bca636a, 0xfd7ef73c, 0x8b9ff8a1, 0x50ba99dd, + 0x265b9640, 0xe6f15b25, 0x901054b8, 0x4b3535c4, 0x3dd43a59, + 0xa75c1c69, 0xd1bd13f4, 0x0a987288, 0x7c797d15, 0xbcd3b070, + 0xca32bfed, 0x1117de91, 0x67f6d10c, 0x9142455a, 0xe7a34ac7, + 0x3c862bbb, 0x4a672426, 0x8acde943, 0xfc2ce6de, 0x270987a2, + 0x51e8883f}, + {0x00000000, 0xe8dbfbb9, 0x91b186a8, 0x796a7d11, 0x63657c8a, + 0x8bbe8733, 0xf2d4fa22, 0x1a0f019b, 0x87cc89cf, 0x6f177276, + 0x167d0f67, 0xfea6f4de, 0xe4a9f545, 0x0c720efc, 0x751873ed, + 0x9dc38854, 0x4f9f6244, 0xa74499fd, 0xde2ee4ec, 0x36f51f55, + 0x2cfa1ece, 0xc421e577, 0xbd4b9866, 0x559063df, 0xc853eb8b, + 0x20881032, 0x59e26d23, 0xb139969a, 0xab369701, 0x43ed6cb8, + 0x3a8711a9, 0xd25cea10, 0x9e3ec588, 0x76e53e31, 0x0f8f4320, + 0xe754b899, 0xfd5bb902, 0x158042bb, 0x6cea3faa, 0x8431c413, + 0x19f24c47, 0xf129b7fe, 0x8843caef, 0x60983156, 0x7a9730cd, + 0x924ccb74, 0xeb26b665, 0x03fd4ddc, 0xd1a1a7cc, 0x397a5c75, + 0x40102164, 0xa8cbdadd, 0xb2c4db46, 0x5a1f20ff, 0x23755dee, + 0xcbaea657, 0x566d2e03, 0xbeb6d5ba, 0xc7dca8ab, 0x2f075312, + 0x35085289, 0xddd3a930, 0xa4b9d421, 0x4c622f98, 0x7d7bfbca, + 0x95a00073, 0xecca7d62, 0x041186db, 0x1e1e8740, 0xf6c57cf9, + 0x8faf01e8, 0x6774fa51, 0xfab77205, 0x126c89bc, 0x6b06f4ad, + 0x83dd0f14, 0x99d20e8f, 0x7109f536, 0x08638827, 0xe0b8739e, + 0x32e4998e, 0xda3f6237, 0xa3551f26, 0x4b8ee49f, 0x5181e504, + 0xb95a1ebd, 0xc03063ac, 0x28eb9815, 0xb5281041, 0x5df3ebf8, + 0x249996e9, 0xcc426d50, 0xd64d6ccb, 0x3e969772, 0x47fcea63, + 0xaf2711da, 0xe3453e42, 0x0b9ec5fb, 0x72f4b8ea, 0x9a2f4353, + 0x802042c8, 0x68fbb971, 0x1191c460, 0xf94a3fd9, 0x6489b78d, + 0x8c524c34, 0xf5383125, 0x1de3ca9c, 0x07eccb07, 0xef3730be, + 0x965d4daf, 0x7e86b616, 0xacda5c06, 0x4401a7bf, 0x3d6bdaae, + 0xd5b02117, 0xcfbf208c, 0x2764db35, 0x5e0ea624, 0xb6d55d9d, + 0x2b16d5c9, 0xc3cd2e70, 0xbaa75361, 0x527ca8d8, 0x4873a943, + 0xa0a852fa, 0xd9c22feb, 0x3119d452, 0xbbf0874e, 0x532b7cf7, + 0x2a4101e6, 0xc29afa5f, 0xd895fbc4, 0x304e007d, 0x49247d6c, + 0xa1ff86d5, 0x3c3c0e81, 0xd4e7f538, 0xad8d8829, 0x45567390, + 0x5f59720b, 0xb78289b2, 0xcee8f4a3, 0x26330f1a, 0xf46fe50a, + 0x1cb41eb3, 0x65de63a2, 0x8d05981b, 0x970a9980, 0x7fd16239, + 0x06bb1f28, 0xee60e491, 0x73a36cc5, 0x9b78977c, 0xe212ea6d, + 0x0ac911d4, 0x10c6104f, 0xf81debf6, 0x817796e7, 0x69ac6d5e, + 0x25ce42c6, 0xcd15b97f, 0xb47fc46e, 0x5ca43fd7, 0x46ab3e4c, + 0xae70c5f5, 0xd71ab8e4, 0x3fc1435d, 0xa202cb09, 0x4ad930b0, + 0x33b34da1, 0xdb68b618, 0xc167b783, 0x29bc4c3a, 0x50d6312b, + 0xb80dca92, 0x6a512082, 0x828adb3b, 0xfbe0a62a, 0x133b5d93, + 0x09345c08, 0xe1efa7b1, 0x9885daa0, 0x705e2119, 0xed9da94d, + 0x054652f4, 0x7c2c2fe5, 0x94f7d45c, 0x8ef8d5c7, 0x66232e7e, + 0x1f49536f, 0xf792a8d6, 0xc68b7c84, 0x2e50873d, 0x573afa2c, + 0xbfe10195, 0xa5ee000e, 0x4d35fbb7, 0x345f86a6, 0xdc847d1f, + 0x4147f54b, 0xa99c0ef2, 0xd0f673e3, 0x382d885a, 0x222289c1, + 0xcaf97278, 0xb3930f69, 0x5b48f4d0, 0x89141ec0, 0x61cfe579, + 0x18a59868, 0xf07e63d1, 0xea71624a, 0x02aa99f3, 0x7bc0e4e2, + 0x931b1f5b, 0x0ed8970f, 0xe6036cb6, 0x9f6911a7, 0x77b2ea1e, + 0x6dbdeb85, 0x8566103c, 0xfc0c6d2d, 0x14d79694, 0x58b5b90c, + 0xb06e42b5, 0xc9043fa4, 0x21dfc41d, 0x3bd0c586, 0xd30b3e3f, + 0xaa61432e, 0x42bab897, 0xdf7930c3, 0x37a2cb7a, 0x4ec8b66b, + 0xa6134dd2, 0xbc1c4c49, 0x54c7b7f0, 0x2dadcae1, 0xc5763158, + 0x172adb48, 0xfff120f1, 0x869b5de0, 0x6e40a659, 0x744fa7c2, + 0x9c945c7b, 0xe5fe216a, 0x0d25dad3, 0x90e65287, 0x783da93e, + 0x0157d42f, 0xe98c2f96, 0xf3832e0d, 0x1b58d5b4, 0x6232a8a5, + 0x8ae9531c}, + {0x00000000, 0x919168ae, 0x6325a087, 0xf2b4c829, 0x874c31d4, + 0x16dd597a, 0xe4699153, 0x75f8f9fd, 0x4f9f1373, 0xde0e7bdd, + 0x2cbab3f4, 0xbd2bdb5a, 0xc8d322a7, 0x59424a09, 0xabf68220, + 0x3a67ea8e, 0x9e3e27e6, 0x0faf4f48, 0xfd1b8761, 0x6c8aefcf, + 0x19721632, 0x88e37e9c, 0x7a57b6b5, 0xebc6de1b, 0xd1a13495, + 0x40305c3b, 0xb2849412, 0x2315fcbc, 0x56ed0541, 0xc77c6def, + 0x35c8a5c6, 0xa459cd68, 0x7d7b3f17, 0xecea57b9, 0x1e5e9f90, + 0x8fcff73e, 0xfa370ec3, 0x6ba6666d, 0x9912ae44, 0x0883c6ea, + 0x32e42c64, 0xa37544ca, 0x51c18ce3, 0xc050e44d, 0xb5a81db0, + 0x2439751e, 0xd68dbd37, 0x471cd599, 0xe34518f1, 0x72d4705f, + 0x8060b876, 0x11f1d0d8, 0x64092925, 0xf598418b, 0x072c89a2, + 0x96bde10c, 0xacda0b82, 0x3d4b632c, 0xcfffab05, 0x5e6ec3ab, + 0x2b963a56, 0xba0752f8, 0x48b39ad1, 0xd922f27f, 0xfaf67e2e, + 0x6b671680, 0x99d3dea9, 0x0842b607, 0x7dba4ffa, 0xec2b2754, + 0x1e9fef7d, 0x8f0e87d3, 0xb5696d5d, 0x24f805f3, 0xd64ccdda, + 0x47dda574, 0x32255c89, 0xa3b43427, 0x5100fc0e, 0xc09194a0, + 0x64c859c8, 0xf5593166, 0x07edf94f, 0x967c91e1, 0xe384681c, + 0x721500b2, 0x80a1c89b, 0x1130a035, 0x2b574abb, 0xbac62215, + 0x4872ea3c, 0xd9e38292, 0xac1b7b6f, 0x3d8a13c1, 0xcf3edbe8, + 0x5eafb346, 0x878d4139, 0x161c2997, 0xe4a8e1be, 0x75398910, + 0x00c170ed, 0x91501843, 0x63e4d06a, 0xf275b8c4, 0xc812524a, + 0x59833ae4, 0xab37f2cd, 0x3aa69a63, 0x4f5e639e, 0xdecf0b30, + 0x2c7bc319, 0xbdeaabb7, 0x19b366df, 0x88220e71, 0x7a96c658, + 0xeb07aef6, 0x9eff570b, 0x0f6e3fa5, 0xfddaf78c, 0x6c4b9f22, + 0x562c75ac, 0xc7bd1d02, 0x3509d52b, 0xa498bd85, 0xd1604478, + 0x40f12cd6, 0xb245e4ff, 0x23d48c51, 0xf4edfd5c, 0x657c95f2, + 0x97c85ddb, 0x06593575, 0x73a1cc88, 0xe230a426, 0x10846c0f, + 0x811504a1, 0xbb72ee2f, 0x2ae38681, 0xd8574ea8, 0x49c62606, + 0x3c3edffb, 0xadafb755, 0x5f1b7f7c, 0xce8a17d2, 0x6ad3daba, + 0xfb42b214, 0x09f67a3d, 0x98671293, 0xed9feb6e, 0x7c0e83c0, + 0x8eba4be9, 0x1f2b2347, 0x254cc9c9, 0xb4dda167, 0x4669694e, + 0xd7f801e0, 0xa200f81d, 0x339190b3, 0xc125589a, 0x50b43034, + 0x8996c24b, 0x1807aae5, 0xeab362cc, 0x7b220a62, 0x0edaf39f, + 0x9f4b9b31, 0x6dff5318, 0xfc6e3bb6, 0xc609d138, 0x5798b996, + 0xa52c71bf, 0x34bd1911, 0x4145e0ec, 0xd0d48842, 0x2260406b, + 0xb3f128c5, 0x17a8e5ad, 0x86398d03, 0x748d452a, 0xe51c2d84, + 0x90e4d479, 0x0175bcd7, 0xf3c174fe, 0x62501c50, 0x5837f6de, + 0xc9a69e70, 0x3b125659, 0xaa833ef7, 0xdf7bc70a, 0x4eeaafa4, + 0xbc5e678d, 0x2dcf0f23, 0x0e1b8372, 0x9f8aebdc, 0x6d3e23f5, + 0xfcaf4b5b, 0x8957b2a6, 0x18c6da08, 0xea721221, 0x7be37a8f, + 0x41849001, 0xd015f8af, 0x22a13086, 0xb3305828, 0xc6c8a1d5, + 0x5759c97b, 0xa5ed0152, 0x347c69fc, 0x9025a494, 0x01b4cc3a, + 0xf3000413, 0x62916cbd, 0x17699540, 0x86f8fdee, 0x744c35c7, + 0xe5dd5d69, 0xdfbab7e7, 0x4e2bdf49, 0xbc9f1760, 0x2d0e7fce, + 0x58f68633, 0xc967ee9d, 0x3bd326b4, 0xaa424e1a, 0x7360bc65, + 0xe2f1d4cb, 0x10451ce2, 0x81d4744c, 0xf42c8db1, 0x65bde51f, + 0x97092d36, 0x06984598, 0x3cffaf16, 0xad6ec7b8, 0x5fda0f91, + 0xce4b673f, 0xbbb39ec2, 0x2a22f66c, 0xd8963e45, 0x490756eb, + 0xed5e9b83, 0x7ccff32d, 0x8e7b3b04, 0x1fea53aa, 0x6a12aa57, + 0xfb83c2f9, 0x09370ad0, 0x98a6627e, 0xa2c188f0, 0x3350e05e, + 0xc1e42877, 0x507540d9, 0x258db924, 0xb41cd18a, 0x46a819a3, + 0xd739710d}}; + +#endif + +#endif + +#if N == 5 + +#if W == 8 + +local const z_crc_t FAR crc_braid_table[][256] = { + {0x00000000, 0xaf449247, 0x85f822cf, 0x2abcb088, 0xd08143df, + 0x7fc5d198, 0x55796110, 0xfa3df357, 0x7a7381ff, 0xd53713b8, + 0xff8ba330, 0x50cf3177, 0xaaf2c220, 0x05b65067, 0x2f0ae0ef, + 0x804e72a8, 0xf4e703fe, 0x5ba391b9, 0x711f2131, 0xde5bb376, + 0x24664021, 0x8b22d266, 0xa19e62ee, 0x0edaf0a9, 0x8e948201, + 0x21d01046, 0x0b6ca0ce, 0xa4283289, 0x5e15c1de, 0xf1515399, + 0xdbede311, 0x74a97156, 0x32bf01bd, 0x9dfb93fa, 0xb7472372, + 0x1803b135, 0xe23e4262, 0x4d7ad025, 0x67c660ad, 0xc882f2ea, + 0x48cc8042, 0xe7881205, 0xcd34a28d, 0x627030ca, 0x984dc39d, + 0x370951da, 0x1db5e152, 0xb2f17315, 0xc6580243, 0x691c9004, + 0x43a0208c, 0xece4b2cb, 0x16d9419c, 0xb99dd3db, 0x93216353, + 0x3c65f114, 0xbc2b83bc, 0x136f11fb, 0x39d3a173, 0x96973334, + 0x6caac063, 0xc3ee5224, 0xe952e2ac, 0x461670eb, 0x657e037a, + 0xca3a913d, 0xe08621b5, 0x4fc2b3f2, 0xb5ff40a5, 0x1abbd2e2, + 0x3007626a, 0x9f43f02d, 0x1f0d8285, 0xb04910c2, 0x9af5a04a, + 0x35b1320d, 0xcf8cc15a, 0x60c8531d, 0x4a74e395, 0xe53071d2, + 0x91990084, 0x3edd92c3, 0x1461224b, 0xbb25b00c, 0x4118435b, + 0xee5cd11c, 0xc4e06194, 0x6ba4f3d3, 0xebea817b, 0x44ae133c, + 0x6e12a3b4, 0xc15631f3, 0x3b6bc2a4, 0x942f50e3, 0xbe93e06b, + 0x11d7722c, 0x57c102c7, 0xf8859080, 0xd2392008, 0x7d7db24f, + 0x87404118, 0x2804d35f, 0x02b863d7, 0xadfcf190, 0x2db28338, + 0x82f6117f, 0xa84aa1f7, 0x070e33b0, 0xfd33c0e7, 0x527752a0, + 0x78cbe228, 0xd78f706f, 0xa3260139, 0x0c62937e, 0x26de23f6, + 0x899ab1b1, 0x73a742e6, 0xdce3d0a1, 0xf65f6029, 0x591bf26e, + 0xd95580c6, 0x76111281, 0x5cada209, 0xf3e9304e, 0x09d4c319, + 0xa690515e, 0x8c2ce1d6, 0x23687391, 0xcafc06f4, 0x65b894b3, + 0x4f04243b, 0xe040b67c, 0x1a7d452b, 0xb539d76c, 0x9f8567e4, + 0x30c1f5a3, 0xb08f870b, 0x1fcb154c, 0x3577a5c4, 0x9a333783, + 0x600ec4d4, 0xcf4a5693, 0xe5f6e61b, 0x4ab2745c, 0x3e1b050a, + 0x915f974d, 0xbbe327c5, 0x14a7b582, 0xee9a46d5, 0x41ded492, + 0x6b62641a, 0xc426f65d, 0x446884f5, 0xeb2c16b2, 0xc190a63a, + 0x6ed4347d, 0x94e9c72a, 0x3bad556d, 0x1111e5e5, 0xbe5577a2, + 0xf8430749, 0x5707950e, 0x7dbb2586, 0xd2ffb7c1, 0x28c24496, + 0x8786d6d1, 0xad3a6659, 0x027ef41e, 0x823086b6, 0x2d7414f1, + 0x07c8a479, 0xa88c363e, 0x52b1c569, 0xfdf5572e, 0xd749e7a6, + 0x780d75e1, 0x0ca404b7, 0xa3e096f0, 0x895c2678, 0x2618b43f, + 0xdc254768, 0x7361d52f, 0x59dd65a7, 0xf699f7e0, 0x76d78548, + 0xd993170f, 0xf32fa787, 0x5c6b35c0, 0xa656c697, 0x091254d0, + 0x23aee458, 0x8cea761f, 0xaf82058e, 0x00c697c9, 0x2a7a2741, + 0x853eb506, 0x7f034651, 0xd047d416, 0xfafb649e, 0x55bff6d9, + 0xd5f18471, 0x7ab51636, 0x5009a6be, 0xff4d34f9, 0x0570c7ae, + 0xaa3455e9, 0x8088e561, 0x2fcc7726, 0x5b650670, 0xf4219437, + 0xde9d24bf, 0x71d9b6f8, 0x8be445af, 0x24a0d7e8, 0x0e1c6760, + 0xa158f527, 0x2116878f, 0x8e5215c8, 0xa4eea540, 0x0baa3707, + 0xf197c450, 0x5ed35617, 0x746fe69f, 0xdb2b74d8, 0x9d3d0433, + 0x32799674, 0x18c526fc, 0xb781b4bb, 0x4dbc47ec, 0xe2f8d5ab, + 0xc8446523, 0x6700f764, 0xe74e85cc, 0x480a178b, 0x62b6a703, + 0xcdf23544, 0x37cfc613, 0x988b5454, 0xb237e4dc, 0x1d73769b, + 0x69da07cd, 0xc69e958a, 0xec222502, 0x4366b745, 0xb95b4412, + 0x161fd655, 0x3ca366dd, 0x93e7f49a, 0x13a98632, 0xbced1475, + 0x9651a4fd, 0x391536ba, 0xc328c5ed, 0x6c6c57aa, 0x46d0e722, + 0xe9947565}, + {0x00000000, 0x4e890ba9, 0x9d121752, 0xd39b1cfb, 0xe15528e5, + 0xafdc234c, 0x7c473fb7, 0x32ce341e, 0x19db578b, 0x57525c22, + 0x84c940d9, 0xca404b70, 0xf88e7f6e, 0xb60774c7, 0x659c683c, + 0x2b156395, 0x33b6af16, 0x7d3fa4bf, 0xaea4b844, 0xe02db3ed, + 0xd2e387f3, 0x9c6a8c5a, 0x4ff190a1, 0x01789b08, 0x2a6df89d, + 0x64e4f334, 0xb77fefcf, 0xf9f6e466, 0xcb38d078, 0x85b1dbd1, + 0x562ac72a, 0x18a3cc83, 0x676d5e2c, 0x29e45585, 0xfa7f497e, + 0xb4f642d7, 0x863876c9, 0xc8b17d60, 0x1b2a619b, 0x55a36a32, + 0x7eb609a7, 0x303f020e, 0xe3a41ef5, 0xad2d155c, 0x9fe32142, + 0xd16a2aeb, 0x02f13610, 0x4c783db9, 0x54dbf13a, 0x1a52fa93, + 0xc9c9e668, 0x8740edc1, 0xb58ed9df, 0xfb07d276, 0x289cce8d, + 0x6615c524, 0x4d00a6b1, 0x0389ad18, 0xd012b1e3, 0x9e9bba4a, + 0xac558e54, 0xe2dc85fd, 0x31479906, 0x7fce92af, 0xcedabc58, + 0x8053b7f1, 0x53c8ab0a, 0x1d41a0a3, 0x2f8f94bd, 0x61069f14, + 0xb29d83ef, 0xfc148846, 0xd701ebd3, 0x9988e07a, 0x4a13fc81, + 0x049af728, 0x3654c336, 0x78ddc89f, 0xab46d464, 0xe5cfdfcd, + 0xfd6c134e, 0xb3e518e7, 0x607e041c, 0x2ef70fb5, 0x1c393bab, + 0x52b03002, 0x812b2cf9, 0xcfa22750, 0xe4b744c5, 0xaa3e4f6c, + 0x79a55397, 0x372c583e, 0x05e26c20, 0x4b6b6789, 0x98f07b72, + 0xd67970db, 0xa9b7e274, 0xe73ee9dd, 0x34a5f526, 0x7a2cfe8f, + 0x48e2ca91, 0x066bc138, 0xd5f0ddc3, 0x9b79d66a, 0xb06cb5ff, + 0xfee5be56, 0x2d7ea2ad, 0x63f7a904, 0x51399d1a, 0x1fb096b3, + 0xcc2b8a48, 0x82a281e1, 0x9a014d62, 0xd48846cb, 0x07135a30, + 0x499a5199, 0x7b546587, 0x35dd6e2e, 0xe64672d5, 0xa8cf797c, + 0x83da1ae9, 0xcd531140, 0x1ec80dbb, 0x50410612, 0x628f320c, + 0x2c0639a5, 0xff9d255e, 0xb1142ef7, 0x46c47ef1, 0x084d7558, + 0xdbd669a3, 0x955f620a, 0xa7915614, 0xe9185dbd, 0x3a834146, + 0x740a4aef, 0x5f1f297a, 0x119622d3, 0xc20d3e28, 0x8c843581, + 0xbe4a019f, 0xf0c30a36, 0x235816cd, 0x6dd11d64, 0x7572d1e7, + 0x3bfbda4e, 0xe860c6b5, 0xa6e9cd1c, 0x9427f902, 0xdaaef2ab, + 0x0935ee50, 0x47bce5f9, 0x6ca9866c, 0x22208dc5, 0xf1bb913e, + 0xbf329a97, 0x8dfcae89, 0xc375a520, 0x10eeb9db, 0x5e67b272, + 0x21a920dd, 0x6f202b74, 0xbcbb378f, 0xf2323c26, 0xc0fc0838, + 0x8e750391, 0x5dee1f6a, 0x136714c3, 0x38727756, 0x76fb7cff, + 0xa5606004, 0xebe96bad, 0xd9275fb3, 0x97ae541a, 0x443548e1, + 0x0abc4348, 0x121f8fcb, 0x5c968462, 0x8f0d9899, 0xc1849330, + 0xf34aa72e, 0xbdc3ac87, 0x6e58b07c, 0x20d1bbd5, 0x0bc4d840, + 0x454dd3e9, 0x96d6cf12, 0xd85fc4bb, 0xea91f0a5, 0xa418fb0c, + 0x7783e7f7, 0x390aec5e, 0x881ec2a9, 0xc697c900, 0x150cd5fb, + 0x5b85de52, 0x694bea4c, 0x27c2e1e5, 0xf459fd1e, 0xbad0f6b7, + 0x91c59522, 0xdf4c9e8b, 0x0cd78270, 0x425e89d9, 0x7090bdc7, + 0x3e19b66e, 0xed82aa95, 0xa30ba13c, 0xbba86dbf, 0xf5216616, + 0x26ba7aed, 0x68337144, 0x5afd455a, 0x14744ef3, 0xc7ef5208, + 0x896659a1, 0xa2733a34, 0xecfa319d, 0x3f612d66, 0x71e826cf, + 0x432612d1, 0x0daf1978, 0xde340583, 0x90bd0e2a, 0xef739c85, + 0xa1fa972c, 0x72618bd7, 0x3ce8807e, 0x0e26b460, 0x40afbfc9, + 0x9334a332, 0xddbda89b, 0xf6a8cb0e, 0xb821c0a7, 0x6bbadc5c, + 0x2533d7f5, 0x17fde3eb, 0x5974e842, 0x8aeff4b9, 0xc466ff10, + 0xdcc53393, 0x924c383a, 0x41d724c1, 0x0f5e2f68, 0x3d901b76, + 0x731910df, 0xa0820c24, 0xee0b078d, 0xc51e6418, 0x8b976fb1, + 0x580c734a, 0x168578e3, 0x244b4cfd, 0x6ac24754, 0xb9595baf, + 0xf7d05006}, + {0x00000000, 0x8d88fde2, 0xc060fd85, 0x4de80067, 0x5bb0fd4b, + 0xd63800a9, 0x9bd000ce, 0x1658fd2c, 0xb761fa96, 0x3ae90774, + 0x77010713, 0xfa89faf1, 0xecd107dd, 0x6159fa3f, 0x2cb1fa58, + 0xa13907ba, 0xb5b2f36d, 0x383a0e8f, 0x75d20ee8, 0xf85af30a, + 0xee020e26, 0x638af3c4, 0x2e62f3a3, 0xa3ea0e41, 0x02d309fb, + 0x8f5bf419, 0xc2b3f47e, 0x4f3b099c, 0x5963f4b0, 0xd4eb0952, + 0x99030935, 0x148bf4d7, 0xb014e09b, 0x3d9c1d79, 0x70741d1e, + 0xfdfce0fc, 0xeba41dd0, 0x662ce032, 0x2bc4e055, 0xa64c1db7, + 0x07751a0d, 0x8afde7ef, 0xc715e788, 0x4a9d1a6a, 0x5cc5e746, + 0xd14d1aa4, 0x9ca51ac3, 0x112de721, 0x05a613f6, 0x882eee14, + 0xc5c6ee73, 0x484e1391, 0x5e16eebd, 0xd39e135f, 0x9e761338, + 0x13feeeda, 0xb2c7e960, 0x3f4f1482, 0x72a714e5, 0xff2fe907, + 0xe977142b, 0x64ffe9c9, 0x2917e9ae, 0xa49f144c, 0xbb58c777, + 0x36d03a95, 0x7b383af2, 0xf6b0c710, 0xe0e83a3c, 0x6d60c7de, + 0x2088c7b9, 0xad003a5b, 0x0c393de1, 0x81b1c003, 0xcc59c064, + 0x41d13d86, 0x5789c0aa, 0xda013d48, 0x97e93d2f, 0x1a61c0cd, + 0x0eea341a, 0x8362c9f8, 0xce8ac99f, 0x4302347d, 0x555ac951, + 0xd8d234b3, 0x953a34d4, 0x18b2c936, 0xb98bce8c, 0x3403336e, + 0x79eb3309, 0xf463ceeb, 0xe23b33c7, 0x6fb3ce25, 0x225bce42, + 0xafd333a0, 0x0b4c27ec, 0x86c4da0e, 0xcb2cda69, 0x46a4278b, + 0x50fcdaa7, 0xdd742745, 0x909c2722, 0x1d14dac0, 0xbc2ddd7a, + 0x31a52098, 0x7c4d20ff, 0xf1c5dd1d, 0xe79d2031, 0x6a15ddd3, + 0x27fdddb4, 0xaa752056, 0xbefed481, 0x33762963, 0x7e9e2904, + 0xf316d4e6, 0xe54e29ca, 0x68c6d428, 0x252ed44f, 0xa8a629ad, + 0x099f2e17, 0x8417d3f5, 0xc9ffd392, 0x44772e70, 0x522fd35c, + 0xdfa72ebe, 0x924f2ed9, 0x1fc7d33b, 0xadc088af, 0x2048754d, + 0x6da0752a, 0xe02888c8, 0xf67075e4, 0x7bf88806, 0x36108861, + 0xbb987583, 0x1aa17239, 0x97298fdb, 0xdac18fbc, 0x5749725e, + 0x41118f72, 0xcc997290, 0x817172f7, 0x0cf98f15, 0x18727bc2, + 0x95fa8620, 0xd8128647, 0x559a7ba5, 0x43c28689, 0xce4a7b6b, + 0x83a27b0c, 0x0e2a86ee, 0xaf138154, 0x229b7cb6, 0x6f737cd1, + 0xe2fb8133, 0xf4a37c1f, 0x792b81fd, 0x34c3819a, 0xb94b7c78, + 0x1dd46834, 0x905c95d6, 0xddb495b1, 0x503c6853, 0x4664957f, + 0xcbec689d, 0x860468fa, 0x0b8c9518, 0xaab592a2, 0x273d6f40, + 0x6ad56f27, 0xe75d92c5, 0xf1056fe9, 0x7c8d920b, 0x3165926c, + 0xbced6f8e, 0xa8669b59, 0x25ee66bb, 0x680666dc, 0xe58e9b3e, + 0xf3d66612, 0x7e5e9bf0, 0x33b69b97, 0xbe3e6675, 0x1f0761cf, + 0x928f9c2d, 0xdf679c4a, 0x52ef61a8, 0x44b79c84, 0xc93f6166, + 0x84d76101, 0x095f9ce3, 0x16984fd8, 0x9b10b23a, 0xd6f8b25d, + 0x5b704fbf, 0x4d28b293, 0xc0a04f71, 0x8d484f16, 0x00c0b2f4, + 0xa1f9b54e, 0x2c7148ac, 0x619948cb, 0xec11b529, 0xfa494805, + 0x77c1b5e7, 0x3a29b580, 0xb7a14862, 0xa32abcb5, 0x2ea24157, + 0x634a4130, 0xeec2bcd2, 0xf89a41fe, 0x7512bc1c, 0x38fabc7b, + 0xb5724199, 0x144b4623, 0x99c3bbc1, 0xd42bbba6, 0x59a34644, + 0x4ffbbb68, 0xc273468a, 0x8f9b46ed, 0x0213bb0f, 0xa68caf43, + 0x2b0452a1, 0x66ec52c6, 0xeb64af24, 0xfd3c5208, 0x70b4afea, + 0x3d5caf8d, 0xb0d4526f, 0x11ed55d5, 0x9c65a837, 0xd18da850, + 0x5c0555b2, 0x4a5da89e, 0xc7d5557c, 0x8a3d551b, 0x07b5a8f9, + 0x133e5c2e, 0x9eb6a1cc, 0xd35ea1ab, 0x5ed65c49, 0x488ea165, + 0xc5065c87, 0x88ee5ce0, 0x0566a102, 0xa45fa6b8, 0x29d75b5a, + 0x643f5b3d, 0xe9b7a6df, 0xffef5bf3, 0x7267a611, 0x3f8fa676, + 0xb2075b94}, + {0x00000000, 0x80f0171f, 0xda91287f, 0x5a613f60, 0x6e5356bf, + 0xeea341a0, 0xb4c27ec0, 0x343269df, 0xdca6ad7e, 0x5c56ba61, + 0x06378501, 0x86c7921e, 0xb2f5fbc1, 0x3205ecde, 0x6864d3be, + 0xe894c4a1, 0x623c5cbd, 0xe2cc4ba2, 0xb8ad74c2, 0x385d63dd, + 0x0c6f0a02, 0x8c9f1d1d, 0xd6fe227d, 0x560e3562, 0xbe9af1c3, + 0x3e6ae6dc, 0x640bd9bc, 0xe4fbcea3, 0xd0c9a77c, 0x5039b063, + 0x0a588f03, 0x8aa8981c, 0xc478b97a, 0x4488ae65, 0x1ee99105, + 0x9e19861a, 0xaa2befc5, 0x2adbf8da, 0x70bac7ba, 0xf04ad0a5, + 0x18de1404, 0x982e031b, 0xc24f3c7b, 0x42bf2b64, 0x768d42bb, + 0xf67d55a4, 0xac1c6ac4, 0x2cec7ddb, 0xa644e5c7, 0x26b4f2d8, + 0x7cd5cdb8, 0xfc25daa7, 0xc817b378, 0x48e7a467, 0x12869b07, + 0x92768c18, 0x7ae248b9, 0xfa125fa6, 0xa07360c6, 0x208377d9, + 0x14b11e06, 0x94410919, 0xce203679, 0x4ed02166, 0x538074b5, + 0xd37063aa, 0x89115cca, 0x09e14bd5, 0x3dd3220a, 0xbd233515, + 0xe7420a75, 0x67b21d6a, 0x8f26d9cb, 0x0fd6ced4, 0x55b7f1b4, + 0xd547e6ab, 0xe1758f74, 0x6185986b, 0x3be4a70b, 0xbb14b014, + 0x31bc2808, 0xb14c3f17, 0xeb2d0077, 0x6bdd1768, 0x5fef7eb7, + 0xdf1f69a8, 0x857e56c8, 0x058e41d7, 0xed1a8576, 0x6dea9269, + 0x378bad09, 0xb77bba16, 0x8349d3c9, 0x03b9c4d6, 0x59d8fbb6, + 0xd928eca9, 0x97f8cdcf, 0x1708dad0, 0x4d69e5b0, 0xcd99f2af, + 0xf9ab9b70, 0x795b8c6f, 0x233ab30f, 0xa3caa410, 0x4b5e60b1, + 0xcbae77ae, 0x91cf48ce, 0x113f5fd1, 0x250d360e, 0xa5fd2111, + 0xff9c1e71, 0x7f6c096e, 0xf5c49172, 0x7534866d, 0x2f55b90d, + 0xafa5ae12, 0x9b97c7cd, 0x1b67d0d2, 0x4106efb2, 0xc1f6f8ad, + 0x29623c0c, 0xa9922b13, 0xf3f31473, 0x7303036c, 0x47316ab3, + 0xc7c17dac, 0x9da042cc, 0x1d5055d3, 0xa700e96a, 0x27f0fe75, + 0x7d91c115, 0xfd61d60a, 0xc953bfd5, 0x49a3a8ca, 0x13c297aa, + 0x933280b5, 0x7ba64414, 0xfb56530b, 0xa1376c6b, 0x21c77b74, + 0x15f512ab, 0x950505b4, 0xcf643ad4, 0x4f942dcb, 0xc53cb5d7, + 0x45cca2c8, 0x1fad9da8, 0x9f5d8ab7, 0xab6fe368, 0x2b9ff477, + 0x71fecb17, 0xf10edc08, 0x199a18a9, 0x996a0fb6, 0xc30b30d6, + 0x43fb27c9, 0x77c94e16, 0xf7395909, 0xad586669, 0x2da87176, + 0x63785010, 0xe388470f, 0xb9e9786f, 0x39196f70, 0x0d2b06af, + 0x8ddb11b0, 0xd7ba2ed0, 0x574a39cf, 0xbfdefd6e, 0x3f2eea71, + 0x654fd511, 0xe5bfc20e, 0xd18dabd1, 0x517dbcce, 0x0b1c83ae, + 0x8bec94b1, 0x01440cad, 0x81b41bb2, 0xdbd524d2, 0x5b2533cd, + 0x6f175a12, 0xefe74d0d, 0xb586726d, 0x35766572, 0xdde2a1d3, + 0x5d12b6cc, 0x077389ac, 0x87839eb3, 0xb3b1f76c, 0x3341e073, + 0x6920df13, 0xe9d0c80c, 0xf4809ddf, 0x74708ac0, 0x2e11b5a0, + 0xaee1a2bf, 0x9ad3cb60, 0x1a23dc7f, 0x4042e31f, 0xc0b2f400, + 0x282630a1, 0xa8d627be, 0xf2b718de, 0x72470fc1, 0x4675661e, + 0xc6857101, 0x9ce44e61, 0x1c14597e, 0x96bcc162, 0x164cd67d, + 0x4c2de91d, 0xccddfe02, 0xf8ef97dd, 0x781f80c2, 0x227ebfa2, + 0xa28ea8bd, 0x4a1a6c1c, 0xcaea7b03, 0x908b4463, 0x107b537c, + 0x24493aa3, 0xa4b92dbc, 0xfed812dc, 0x7e2805c3, 0x30f824a5, + 0xb00833ba, 0xea690cda, 0x6a991bc5, 0x5eab721a, 0xde5b6505, + 0x843a5a65, 0x04ca4d7a, 0xec5e89db, 0x6cae9ec4, 0x36cfa1a4, + 0xb63fb6bb, 0x820ddf64, 0x02fdc87b, 0x589cf71b, 0xd86ce004, + 0x52c47818, 0xd2346f07, 0x88555067, 0x08a54778, 0x3c972ea7, + 0xbc6739b8, 0xe60606d8, 0x66f611c7, 0x8e62d566, 0x0e92c279, + 0x54f3fd19, 0xd403ea06, 0xe03183d9, 0x60c194c6, 0x3aa0aba6, + 0xba50bcb9}, + {0x00000000, 0x9570d495, 0xf190af6b, 0x64e07bfe, 0x38505897, + 0xad208c02, 0xc9c0f7fc, 0x5cb02369, 0x70a0b12e, 0xe5d065bb, + 0x81301e45, 0x1440cad0, 0x48f0e9b9, 0xdd803d2c, 0xb96046d2, + 0x2c109247, 0xe141625c, 0x7431b6c9, 0x10d1cd37, 0x85a119a2, + 0xd9113acb, 0x4c61ee5e, 0x288195a0, 0xbdf14135, 0x91e1d372, + 0x049107e7, 0x60717c19, 0xf501a88c, 0xa9b18be5, 0x3cc15f70, + 0x5821248e, 0xcd51f01b, 0x19f3c2f9, 0x8c83166c, 0xe8636d92, + 0x7d13b907, 0x21a39a6e, 0xb4d34efb, 0xd0333505, 0x4543e190, + 0x695373d7, 0xfc23a742, 0x98c3dcbc, 0x0db30829, 0x51032b40, + 0xc473ffd5, 0xa093842b, 0x35e350be, 0xf8b2a0a5, 0x6dc27430, + 0x09220fce, 0x9c52db5b, 0xc0e2f832, 0x55922ca7, 0x31725759, + 0xa40283cc, 0x8812118b, 0x1d62c51e, 0x7982bee0, 0xecf26a75, + 0xb042491c, 0x25329d89, 0x41d2e677, 0xd4a232e2, 0x33e785f2, + 0xa6975167, 0xc2772a99, 0x5707fe0c, 0x0bb7dd65, 0x9ec709f0, + 0xfa27720e, 0x6f57a69b, 0x434734dc, 0xd637e049, 0xb2d79bb7, + 0x27a74f22, 0x7b176c4b, 0xee67b8de, 0x8a87c320, 0x1ff717b5, + 0xd2a6e7ae, 0x47d6333b, 0x233648c5, 0xb6469c50, 0xeaf6bf39, + 0x7f866bac, 0x1b661052, 0x8e16c4c7, 0xa2065680, 0x37768215, + 0x5396f9eb, 0xc6e62d7e, 0x9a560e17, 0x0f26da82, 0x6bc6a17c, + 0xfeb675e9, 0x2a14470b, 0xbf64939e, 0xdb84e860, 0x4ef43cf5, + 0x12441f9c, 0x8734cb09, 0xe3d4b0f7, 0x76a46462, 0x5ab4f625, + 0xcfc422b0, 0xab24594e, 0x3e548ddb, 0x62e4aeb2, 0xf7947a27, + 0x937401d9, 0x0604d54c, 0xcb552557, 0x5e25f1c2, 0x3ac58a3c, + 0xafb55ea9, 0xf3057dc0, 0x6675a955, 0x0295d2ab, 0x97e5063e, + 0xbbf59479, 0x2e8540ec, 0x4a653b12, 0xdf15ef87, 0x83a5ccee, + 0x16d5187b, 0x72356385, 0xe745b710, 0x67cf0be4, 0xf2bfdf71, + 0x965fa48f, 0x032f701a, 0x5f9f5373, 0xcaef87e6, 0xae0ffc18, + 0x3b7f288d, 0x176fbaca, 0x821f6e5f, 0xe6ff15a1, 0x738fc134, + 0x2f3fe25d, 0xba4f36c8, 0xdeaf4d36, 0x4bdf99a3, 0x868e69b8, + 0x13febd2d, 0x771ec6d3, 0xe26e1246, 0xbede312f, 0x2baee5ba, + 0x4f4e9e44, 0xda3e4ad1, 0xf62ed896, 0x635e0c03, 0x07be77fd, + 0x92cea368, 0xce7e8001, 0x5b0e5494, 0x3fee2f6a, 0xaa9efbff, + 0x7e3cc91d, 0xeb4c1d88, 0x8fac6676, 0x1adcb2e3, 0x466c918a, + 0xd31c451f, 0xb7fc3ee1, 0x228cea74, 0x0e9c7833, 0x9becaca6, + 0xff0cd758, 0x6a7c03cd, 0x36cc20a4, 0xa3bcf431, 0xc75c8fcf, + 0x522c5b5a, 0x9f7dab41, 0x0a0d7fd4, 0x6eed042a, 0xfb9dd0bf, + 0xa72df3d6, 0x325d2743, 0x56bd5cbd, 0xc3cd8828, 0xefdd1a6f, + 0x7aadcefa, 0x1e4db504, 0x8b3d6191, 0xd78d42f8, 0x42fd966d, + 0x261ded93, 0xb36d3906, 0x54288e16, 0xc1585a83, 0xa5b8217d, + 0x30c8f5e8, 0x6c78d681, 0xf9080214, 0x9de879ea, 0x0898ad7f, + 0x24883f38, 0xb1f8ebad, 0xd5189053, 0x406844c6, 0x1cd867af, + 0x89a8b33a, 0xed48c8c4, 0x78381c51, 0xb569ec4a, 0x201938df, + 0x44f94321, 0xd18997b4, 0x8d39b4dd, 0x18496048, 0x7ca91bb6, + 0xe9d9cf23, 0xc5c95d64, 0x50b989f1, 0x3459f20f, 0xa129269a, + 0xfd9905f3, 0x68e9d166, 0x0c09aa98, 0x99797e0d, 0x4ddb4cef, + 0xd8ab987a, 0xbc4be384, 0x293b3711, 0x758b1478, 0xe0fbc0ed, + 0x841bbb13, 0x116b6f86, 0x3d7bfdc1, 0xa80b2954, 0xcceb52aa, + 0x599b863f, 0x052ba556, 0x905b71c3, 0xf4bb0a3d, 0x61cbdea8, + 0xac9a2eb3, 0x39eafa26, 0x5d0a81d8, 0xc87a554d, 0x94ca7624, + 0x01baa2b1, 0x655ad94f, 0xf02a0dda, 0xdc3a9f9d, 0x494a4b08, + 0x2daa30f6, 0xb8dae463, 0xe46ac70a, 0x711a139f, 0x15fa6861, + 0x808abcf4}, + {0x00000000, 0xcf9e17c8, 0x444d29d1, 0x8bd33e19, 0x889a53a2, + 0x4704446a, 0xccd77a73, 0x03496dbb, 0xca45a105, 0x05dbb6cd, + 0x8e0888d4, 0x41969f1c, 0x42dff2a7, 0x8d41e56f, 0x0692db76, + 0xc90cccbe, 0x4ffa444b, 0x80645383, 0x0bb76d9a, 0xc4297a52, + 0xc76017e9, 0x08fe0021, 0x832d3e38, 0x4cb329f0, 0x85bfe54e, + 0x4a21f286, 0xc1f2cc9f, 0x0e6cdb57, 0x0d25b6ec, 0xc2bba124, + 0x49689f3d, 0x86f688f5, 0x9ff48896, 0x506a9f5e, 0xdbb9a147, + 0x1427b68f, 0x176edb34, 0xd8f0ccfc, 0x5323f2e5, 0x9cbde52d, + 0x55b12993, 0x9a2f3e5b, 0x11fc0042, 0xde62178a, 0xdd2b7a31, + 0x12b56df9, 0x996653e0, 0x56f84428, 0xd00eccdd, 0x1f90db15, + 0x9443e50c, 0x5bddf2c4, 0x58949f7f, 0x970a88b7, 0x1cd9b6ae, + 0xd347a166, 0x1a4b6dd8, 0xd5d57a10, 0x5e064409, 0x919853c1, + 0x92d13e7a, 0x5d4f29b2, 0xd69c17ab, 0x19020063, 0xe498176d, + 0x2b0600a5, 0xa0d53ebc, 0x6f4b2974, 0x6c0244cf, 0xa39c5307, + 0x284f6d1e, 0xe7d17ad6, 0x2eddb668, 0xe143a1a0, 0x6a909fb9, + 0xa50e8871, 0xa647e5ca, 0x69d9f202, 0xe20acc1b, 0x2d94dbd3, + 0xab625326, 0x64fc44ee, 0xef2f7af7, 0x20b16d3f, 0x23f80084, + 0xec66174c, 0x67b52955, 0xa82b3e9d, 0x6127f223, 0xaeb9e5eb, + 0x256adbf2, 0xeaf4cc3a, 0xe9bda181, 0x2623b649, 0xadf08850, + 0x626e9f98, 0x7b6c9ffb, 0xb4f28833, 0x3f21b62a, 0xf0bfa1e2, + 0xf3f6cc59, 0x3c68db91, 0xb7bbe588, 0x7825f240, 0xb1293efe, + 0x7eb72936, 0xf564172f, 0x3afa00e7, 0x39b36d5c, 0xf62d7a94, + 0x7dfe448d, 0xb2605345, 0x3496dbb0, 0xfb08cc78, 0x70dbf261, + 0xbf45e5a9, 0xbc0c8812, 0x73929fda, 0xf841a1c3, 0x37dfb60b, + 0xfed37ab5, 0x314d6d7d, 0xba9e5364, 0x750044ac, 0x76492917, + 0xb9d73edf, 0x320400c6, 0xfd9a170e, 0x1241289b, 0xdddf3f53, + 0x560c014a, 0x99921682, 0x9adb7b39, 0x55456cf1, 0xde9652e8, + 0x11084520, 0xd804899e, 0x179a9e56, 0x9c49a04f, 0x53d7b787, + 0x509eda3c, 0x9f00cdf4, 0x14d3f3ed, 0xdb4de425, 0x5dbb6cd0, + 0x92257b18, 0x19f64501, 0xd66852c9, 0xd5213f72, 0x1abf28ba, + 0x916c16a3, 0x5ef2016b, 0x97fecdd5, 0x5860da1d, 0xd3b3e404, + 0x1c2df3cc, 0x1f649e77, 0xd0fa89bf, 0x5b29b7a6, 0x94b7a06e, + 0x8db5a00d, 0x422bb7c5, 0xc9f889dc, 0x06669e14, 0x052ff3af, + 0xcab1e467, 0x4162da7e, 0x8efccdb6, 0x47f00108, 0x886e16c0, + 0x03bd28d9, 0xcc233f11, 0xcf6a52aa, 0x00f44562, 0x8b277b7b, + 0x44b96cb3, 0xc24fe446, 0x0dd1f38e, 0x8602cd97, 0x499cda5f, + 0x4ad5b7e4, 0x854ba02c, 0x0e989e35, 0xc10689fd, 0x080a4543, + 0xc794528b, 0x4c476c92, 0x83d97b5a, 0x809016e1, 0x4f0e0129, + 0xc4dd3f30, 0x0b4328f8, 0xf6d93ff6, 0x3947283e, 0xb2941627, + 0x7d0a01ef, 0x7e436c54, 0xb1dd7b9c, 0x3a0e4585, 0xf590524d, + 0x3c9c9ef3, 0xf302893b, 0x78d1b722, 0xb74fa0ea, 0xb406cd51, + 0x7b98da99, 0xf04be480, 0x3fd5f348, 0xb9237bbd, 0x76bd6c75, + 0xfd6e526c, 0x32f045a4, 0x31b9281f, 0xfe273fd7, 0x75f401ce, + 0xba6a1606, 0x7366dab8, 0xbcf8cd70, 0x372bf369, 0xf8b5e4a1, + 0xfbfc891a, 0x34629ed2, 0xbfb1a0cb, 0x702fb703, 0x692db760, + 0xa6b3a0a8, 0x2d609eb1, 0xe2fe8979, 0xe1b7e4c2, 0x2e29f30a, + 0xa5facd13, 0x6a64dadb, 0xa3681665, 0x6cf601ad, 0xe7253fb4, + 0x28bb287c, 0x2bf245c7, 0xe46c520f, 0x6fbf6c16, 0xa0217bde, + 0x26d7f32b, 0xe949e4e3, 0x629adafa, 0xad04cd32, 0xae4da089, + 0x61d3b741, 0xea008958, 0x259e9e90, 0xec92522e, 0x230c45e6, + 0xa8df7bff, 0x67416c37, 0x6408018c, 0xab961644, 0x2045285d, + 0xefdb3f95}, + {0x00000000, 0x24825136, 0x4904a26c, 0x6d86f35a, 0x920944d8, + 0xb68b15ee, 0xdb0de6b4, 0xff8fb782, 0xff638ff1, 0xdbe1dec7, + 0xb6672d9d, 0x92e57cab, 0x6d6acb29, 0x49e89a1f, 0x246e6945, + 0x00ec3873, 0x25b619a3, 0x01344895, 0x6cb2bbcf, 0x4830eaf9, + 0xb7bf5d7b, 0x933d0c4d, 0xfebbff17, 0xda39ae21, 0xdad59652, + 0xfe57c764, 0x93d1343e, 0xb7536508, 0x48dcd28a, 0x6c5e83bc, + 0x01d870e6, 0x255a21d0, 0x4b6c3346, 0x6fee6270, 0x0268912a, + 0x26eac01c, 0xd965779e, 0xfde726a8, 0x9061d5f2, 0xb4e384c4, + 0xb40fbcb7, 0x908ded81, 0xfd0b1edb, 0xd9894fed, 0x2606f86f, + 0x0284a959, 0x6f025a03, 0x4b800b35, 0x6eda2ae5, 0x4a587bd3, + 0x27de8889, 0x035cd9bf, 0xfcd36e3d, 0xd8513f0b, 0xb5d7cc51, + 0x91559d67, 0x91b9a514, 0xb53bf422, 0xd8bd0778, 0xfc3f564e, + 0x03b0e1cc, 0x2732b0fa, 0x4ab443a0, 0x6e361296, 0x96d8668c, + 0xb25a37ba, 0xdfdcc4e0, 0xfb5e95d6, 0x04d12254, 0x20537362, + 0x4dd58038, 0x6957d10e, 0x69bbe97d, 0x4d39b84b, 0x20bf4b11, + 0x043d1a27, 0xfbb2ada5, 0xdf30fc93, 0xb2b60fc9, 0x96345eff, + 0xb36e7f2f, 0x97ec2e19, 0xfa6add43, 0xdee88c75, 0x21673bf7, + 0x05e56ac1, 0x6863999b, 0x4ce1c8ad, 0x4c0df0de, 0x688fa1e8, + 0x050952b2, 0x218b0384, 0xde04b406, 0xfa86e530, 0x9700166a, + 0xb382475c, 0xddb455ca, 0xf93604fc, 0x94b0f7a6, 0xb032a690, + 0x4fbd1112, 0x6b3f4024, 0x06b9b37e, 0x223be248, 0x22d7da3b, + 0x06558b0d, 0x6bd37857, 0x4f512961, 0xb0de9ee3, 0x945ccfd5, + 0xf9da3c8f, 0xdd586db9, 0xf8024c69, 0xdc801d5f, 0xb106ee05, + 0x9584bf33, 0x6a0b08b1, 0x4e895987, 0x230faadd, 0x078dfbeb, + 0x0761c398, 0x23e392ae, 0x4e6561f4, 0x6ae730c2, 0x95688740, + 0xb1ead676, 0xdc6c252c, 0xf8ee741a, 0xf6c1cb59, 0xd2439a6f, + 0xbfc56935, 0x9b473803, 0x64c88f81, 0x404adeb7, 0x2dcc2ded, + 0x094e7cdb, 0x09a244a8, 0x2d20159e, 0x40a6e6c4, 0x6424b7f2, + 0x9bab0070, 0xbf295146, 0xd2afa21c, 0xf62df32a, 0xd377d2fa, + 0xf7f583cc, 0x9a737096, 0xbef121a0, 0x417e9622, 0x65fcc714, + 0x087a344e, 0x2cf86578, 0x2c145d0b, 0x08960c3d, 0x6510ff67, + 0x4192ae51, 0xbe1d19d3, 0x9a9f48e5, 0xf719bbbf, 0xd39bea89, + 0xbdadf81f, 0x992fa929, 0xf4a95a73, 0xd02b0b45, 0x2fa4bcc7, + 0x0b26edf1, 0x66a01eab, 0x42224f9d, 0x42ce77ee, 0x664c26d8, + 0x0bcad582, 0x2f4884b4, 0xd0c73336, 0xf4456200, 0x99c3915a, + 0xbd41c06c, 0x981be1bc, 0xbc99b08a, 0xd11f43d0, 0xf59d12e6, + 0x0a12a564, 0x2e90f452, 0x43160708, 0x6794563e, 0x67786e4d, + 0x43fa3f7b, 0x2e7ccc21, 0x0afe9d17, 0xf5712a95, 0xd1f37ba3, + 0xbc7588f9, 0x98f7d9cf, 0x6019add5, 0x449bfce3, 0x291d0fb9, + 0x0d9f5e8f, 0xf210e90d, 0xd692b83b, 0xbb144b61, 0x9f961a57, + 0x9f7a2224, 0xbbf87312, 0xd67e8048, 0xf2fcd17e, 0x0d7366fc, + 0x29f137ca, 0x4477c490, 0x60f595a6, 0x45afb476, 0x612de540, + 0x0cab161a, 0x2829472c, 0xd7a6f0ae, 0xf324a198, 0x9ea252c2, + 0xba2003f4, 0xbacc3b87, 0x9e4e6ab1, 0xf3c899eb, 0xd74ac8dd, + 0x28c57f5f, 0x0c472e69, 0x61c1dd33, 0x45438c05, 0x2b759e93, + 0x0ff7cfa5, 0x62713cff, 0x46f36dc9, 0xb97cda4b, 0x9dfe8b7d, + 0xf0787827, 0xd4fa2911, 0xd4161162, 0xf0944054, 0x9d12b30e, + 0xb990e238, 0x461f55ba, 0x629d048c, 0x0f1bf7d6, 0x2b99a6e0, + 0x0ec38730, 0x2a41d606, 0x47c7255c, 0x6345746a, 0x9ccac3e8, + 0xb84892de, 0xd5ce6184, 0xf14c30b2, 0xf1a008c1, 0xd52259f7, + 0xb8a4aaad, 0x9c26fb9b, 0x63a94c19, 0x472b1d2f, 0x2aadee75, + 0x0e2fbf43}, + {0x00000000, 0x36f290f3, 0x6de521e6, 0x5b17b115, 0xdbca43cc, + 0xed38d33f, 0xb62f622a, 0x80ddf2d9, 0x6ce581d9, 0x5a17112a, + 0x0100a03f, 0x37f230cc, 0xb72fc215, 0x81dd52e6, 0xdacae3f3, + 0xec387300, 0xd9cb03b2, 0xef399341, 0xb42e2254, 0x82dcb2a7, + 0x0201407e, 0x34f3d08d, 0x6fe46198, 0x5916f16b, 0xb52e826b, + 0x83dc1298, 0xd8cba38d, 0xee39337e, 0x6ee4c1a7, 0x58165154, + 0x0301e041, 0x35f370b2, 0x68e70125, 0x5e1591d6, 0x050220c3, + 0x33f0b030, 0xb32d42e9, 0x85dfd21a, 0xdec8630f, 0xe83af3fc, + 0x040280fc, 0x32f0100f, 0x69e7a11a, 0x5f1531e9, 0xdfc8c330, + 0xe93a53c3, 0xb22de2d6, 0x84df7225, 0xb12c0297, 0x87de9264, + 0xdcc92371, 0xea3bb382, 0x6ae6415b, 0x5c14d1a8, 0x070360bd, + 0x31f1f04e, 0xddc9834e, 0xeb3b13bd, 0xb02ca2a8, 0x86de325b, + 0x0603c082, 0x30f15071, 0x6be6e164, 0x5d147197, 0xd1ce024a, + 0xe73c92b9, 0xbc2b23ac, 0x8ad9b35f, 0x0a044186, 0x3cf6d175, + 0x67e16060, 0x5113f093, 0xbd2b8393, 0x8bd91360, 0xd0cea275, + 0xe63c3286, 0x66e1c05f, 0x501350ac, 0x0b04e1b9, 0x3df6714a, + 0x080501f8, 0x3ef7910b, 0x65e0201e, 0x5312b0ed, 0xd3cf4234, + 0xe53dd2c7, 0xbe2a63d2, 0x88d8f321, 0x64e08021, 0x521210d2, + 0x0905a1c7, 0x3ff73134, 0xbf2ac3ed, 0x89d8531e, 0xd2cfe20b, + 0xe43d72f8, 0xb929036f, 0x8fdb939c, 0xd4cc2289, 0xe23eb27a, + 0x62e340a3, 0x5411d050, 0x0f066145, 0x39f4f1b6, 0xd5cc82b6, + 0xe33e1245, 0xb829a350, 0x8edb33a3, 0x0e06c17a, 0x38f45189, + 0x63e3e09c, 0x5511706f, 0x60e200dd, 0x5610902e, 0x0d07213b, + 0x3bf5b1c8, 0xbb284311, 0x8ddad3e2, 0xd6cd62f7, 0xe03ff204, + 0x0c078104, 0x3af511f7, 0x61e2a0e2, 0x57103011, 0xd7cdc2c8, + 0xe13f523b, 0xba28e32e, 0x8cda73dd, 0x78ed02d5, 0x4e1f9226, + 0x15082333, 0x23fab3c0, 0xa3274119, 0x95d5d1ea, 0xcec260ff, + 0xf830f00c, 0x1408830c, 0x22fa13ff, 0x79eda2ea, 0x4f1f3219, + 0xcfc2c0c0, 0xf9305033, 0xa227e126, 0x94d571d5, 0xa1260167, + 0x97d49194, 0xccc32081, 0xfa31b072, 0x7aec42ab, 0x4c1ed258, + 0x1709634d, 0x21fbf3be, 0xcdc380be, 0xfb31104d, 0xa026a158, + 0x96d431ab, 0x1609c372, 0x20fb5381, 0x7bece294, 0x4d1e7267, + 0x100a03f0, 0x26f89303, 0x7def2216, 0x4b1db2e5, 0xcbc0403c, + 0xfd32d0cf, 0xa62561da, 0x90d7f129, 0x7cef8229, 0x4a1d12da, + 0x110aa3cf, 0x27f8333c, 0xa725c1e5, 0x91d75116, 0xcac0e003, + 0xfc3270f0, 0xc9c10042, 0xff3390b1, 0xa42421a4, 0x92d6b157, + 0x120b438e, 0x24f9d37d, 0x7fee6268, 0x491cf29b, 0xa524819b, + 0x93d61168, 0xc8c1a07d, 0xfe33308e, 0x7eeec257, 0x481c52a4, + 0x130be3b1, 0x25f97342, 0xa923009f, 0x9fd1906c, 0xc4c62179, + 0xf234b18a, 0x72e94353, 0x441bd3a0, 0x1f0c62b5, 0x29fef246, + 0xc5c68146, 0xf33411b5, 0xa823a0a0, 0x9ed13053, 0x1e0cc28a, + 0x28fe5279, 0x73e9e36c, 0x451b739f, 0x70e8032d, 0x461a93de, + 0x1d0d22cb, 0x2bffb238, 0xab2240e1, 0x9dd0d012, 0xc6c76107, + 0xf035f1f4, 0x1c0d82f4, 0x2aff1207, 0x71e8a312, 0x471a33e1, + 0xc7c7c138, 0xf13551cb, 0xaa22e0de, 0x9cd0702d, 0xc1c401ba, + 0xf7369149, 0xac21205c, 0x9ad3b0af, 0x1a0e4276, 0x2cfcd285, + 0x77eb6390, 0x4119f363, 0xad218063, 0x9bd31090, 0xc0c4a185, + 0xf6363176, 0x76ebc3af, 0x4019535c, 0x1b0ee249, 0x2dfc72ba, + 0x180f0208, 0x2efd92fb, 0x75ea23ee, 0x4318b31d, 0xc3c541c4, + 0xf537d137, 0xae206022, 0x98d2f0d1, 0x74ea83d1, 0x42181322, + 0x190fa237, 0x2ffd32c4, 0xaf20c01d, 0x99d250ee, 0xc2c5e1fb, + 0xf4377108}}; + +local const z_word_t FAR crc_braid_big_table[][256] = { + {0x0000000000000000, 0xf390f23600000000, 0xe621e56d00000000, + 0x15b1175b00000000, 0xcc43cadb00000000, 0x3fd338ed00000000, + 0x2a622fb600000000, 0xd9f2dd8000000000, 0xd981e56c00000000, + 0x2a11175a00000000, 0x3fa0000100000000, 0xcc30f23700000000, + 0x15c22fb700000000, 0xe652dd8100000000, 0xf3e3cada00000000, + 0x007338ec00000000, 0xb203cbd900000000, 0x419339ef00000000, + 0x54222eb400000000, 0xa7b2dc8200000000, 0x7e40010200000000, + 0x8dd0f33400000000, 0x9861e46f00000000, 0x6bf1165900000000, + 0x6b822eb500000000, 0x9812dc8300000000, 0x8da3cbd800000000, + 0x7e3339ee00000000, 0xa7c1e46e00000000, 0x5451165800000000, + 0x41e0010300000000, 0xb270f33500000000, 0x2501e76800000000, + 0xd691155e00000000, 0xc320020500000000, 0x30b0f03300000000, + 0xe9422db300000000, 0x1ad2df8500000000, 0x0f63c8de00000000, + 0xfcf33ae800000000, 0xfc80020400000000, 0x0f10f03200000000, + 0x1aa1e76900000000, 0xe931155f00000000, 0x30c3c8df00000000, + 0xc3533ae900000000, 0xd6e22db200000000, 0x2572df8400000000, + 0x97022cb100000000, 0x6492de8700000000, 0x7123c9dc00000000, + 0x82b33bea00000000, 0x5b41e66a00000000, 0xa8d1145c00000000, + 0xbd60030700000000, 0x4ef0f13100000000, 0x4e83c9dd00000000, + 0xbd133beb00000000, 0xa8a22cb000000000, 0x5b32de8600000000, + 0x82c0030600000000, 0x7150f13000000000, 0x64e1e66b00000000, + 0x9771145d00000000, 0x4a02ced100000000, 0xb9923ce700000000, + 0xac232bbc00000000, 0x5fb3d98a00000000, 0x8641040a00000000, + 0x75d1f63c00000000, 0x6060e16700000000, 0x93f0135100000000, + 0x93832bbd00000000, 0x6013d98b00000000, 0x75a2ced000000000, + 0x86323ce600000000, 0x5fc0e16600000000, 0xac50135000000000, + 0xb9e1040b00000000, 0x4a71f63d00000000, 0xf801050800000000, + 0x0b91f73e00000000, 0x1e20e06500000000, 0xedb0125300000000, + 0x3442cfd300000000, 0xc7d23de500000000, 0xd2632abe00000000, + 0x21f3d88800000000, 0x2180e06400000000, 0xd210125200000000, + 0xc7a1050900000000, 0x3431f73f00000000, 0xedc32abf00000000, + 0x1e53d88900000000, 0x0be2cfd200000000, 0xf8723de400000000, + 0x6f0329b900000000, 0x9c93db8f00000000, 0x8922ccd400000000, + 0x7ab23ee200000000, 0xa340e36200000000, 0x50d0115400000000, + 0x4561060f00000000, 0xb6f1f43900000000, 0xb682ccd500000000, + 0x45123ee300000000, 0x50a329b800000000, 0xa333db8e00000000, + 0x7ac1060e00000000, 0x8951f43800000000, 0x9ce0e36300000000, + 0x6f70115500000000, 0xdd00e26000000000, 0x2e90105600000000, + 0x3b21070d00000000, 0xc8b1f53b00000000, 0x114328bb00000000, + 0xe2d3da8d00000000, 0xf762cdd600000000, 0x04f23fe000000000, + 0x0481070c00000000, 0xf711f53a00000000, 0xe2a0e26100000000, + 0x1130105700000000, 0xc8c2cdd700000000, 0x3b523fe100000000, + 0x2ee328ba00000000, 0xdd73da8c00000000, 0xd502ed7800000000, + 0x26921f4e00000000, 0x3323081500000000, 0xc0b3fa2300000000, + 0x194127a300000000, 0xead1d59500000000, 0xff60c2ce00000000, + 0x0cf030f800000000, 0x0c83081400000000, 0xff13fa2200000000, + 0xeaa2ed7900000000, 0x19321f4f00000000, 0xc0c0c2cf00000000, + 0x335030f900000000, 0x26e127a200000000, 0xd571d59400000000, + 0x670126a100000000, 0x9491d49700000000, 0x8120c3cc00000000, + 0x72b031fa00000000, 0xab42ec7a00000000, 0x58d21e4c00000000, + 0x4d63091700000000, 0xbef3fb2100000000, 0xbe80c3cd00000000, + 0x4d1031fb00000000, 0x58a126a000000000, 0xab31d49600000000, + 0x72c3091600000000, 0x8153fb2000000000, 0x94e2ec7b00000000, + 0x67721e4d00000000, 0xf0030a1000000000, 0x0393f82600000000, + 0x1622ef7d00000000, 0xe5b21d4b00000000, 0x3c40c0cb00000000, + 0xcfd032fd00000000, 0xda6125a600000000, 0x29f1d79000000000, + 0x2982ef7c00000000, 0xda121d4a00000000, 0xcfa30a1100000000, + 0x3c33f82700000000, 0xe5c125a700000000, 0x1651d79100000000, + 0x03e0c0ca00000000, 0xf07032fc00000000, 0x4200c1c900000000, + 0xb19033ff00000000, 0xa42124a400000000, 0x57b1d69200000000, + 0x8e430b1200000000, 0x7dd3f92400000000, 0x6862ee7f00000000, + 0x9bf21c4900000000, 0x9b8124a500000000, 0x6811d69300000000, + 0x7da0c1c800000000, 0x8e3033fe00000000, 0x57c2ee7e00000000, + 0xa4521c4800000000, 0xb1e30b1300000000, 0x4273f92500000000, + 0x9f0023a900000000, 0x6c90d19f00000000, 0x7921c6c400000000, + 0x8ab134f200000000, 0x5343e97200000000, 0xa0d31b4400000000, + 0xb5620c1f00000000, 0x46f2fe2900000000, 0x4681c6c500000000, + 0xb51134f300000000, 0xa0a023a800000000, 0x5330d19e00000000, + 0x8ac20c1e00000000, 0x7952fe2800000000, 0x6ce3e97300000000, + 0x9f731b4500000000, 0x2d03e87000000000, 0xde931a4600000000, + 0xcb220d1d00000000, 0x38b2ff2b00000000, 0xe14022ab00000000, + 0x12d0d09d00000000, 0x0761c7c600000000, 0xf4f135f000000000, + 0xf4820d1c00000000, 0x0712ff2a00000000, 0x12a3e87100000000, + 0xe1331a4700000000, 0x38c1c7c700000000, 0xcb5135f100000000, + 0xdee022aa00000000, 0x2d70d09c00000000, 0xba01c4c100000000, + 0x499136f700000000, 0x5c2021ac00000000, 0xafb0d39a00000000, + 0x76420e1a00000000, 0x85d2fc2c00000000, 0x9063eb7700000000, + 0x63f3194100000000, 0x638021ad00000000, 0x9010d39b00000000, + 0x85a1c4c000000000, 0x763136f600000000, 0xafc3eb7600000000, + 0x5c53194000000000, 0x49e20e1b00000000, 0xba72fc2d00000000, + 0x08020f1800000000, 0xfb92fd2e00000000, 0xee23ea7500000000, + 0x1db3184300000000, 0xc441c5c300000000, 0x37d137f500000000, + 0x226020ae00000000, 0xd1f0d29800000000, 0xd183ea7400000000, + 0x2213184200000000, 0x37a20f1900000000, 0xc432fd2f00000000, + 0x1dc020af00000000, 0xee50d29900000000, 0xfbe1c5c200000000, + 0x087137f400000000}, + {0x0000000000000000, 0x3651822400000000, 0x6ca2044900000000, + 0x5af3866d00000000, 0xd844099200000000, 0xee158bb600000000, + 0xb4e60ddb00000000, 0x82b78fff00000000, 0xf18f63ff00000000, + 0xc7dee1db00000000, 0x9d2d67b600000000, 0xab7ce59200000000, + 0x29cb6a6d00000000, 0x1f9ae84900000000, 0x45696e2400000000, + 0x7338ec0000000000, 0xa319b62500000000, 0x9548340100000000, + 0xcfbbb26c00000000, 0xf9ea304800000000, 0x7b5dbfb700000000, + 0x4d0c3d9300000000, 0x17ffbbfe00000000, 0x21ae39da00000000, + 0x5296d5da00000000, 0x64c757fe00000000, 0x3e34d19300000000, + 0x086553b700000000, 0x8ad2dc4800000000, 0xbc835e6c00000000, + 0xe670d80100000000, 0xd0215a2500000000, 0x46336c4b00000000, + 0x7062ee6f00000000, 0x2a91680200000000, 0x1cc0ea2600000000, + 0x9e7765d900000000, 0xa826e7fd00000000, 0xf2d5619000000000, + 0xc484e3b400000000, 0xb7bc0fb400000000, 0x81ed8d9000000000, + 0xdb1e0bfd00000000, 0xed4f89d900000000, 0x6ff8062600000000, + 0x59a9840200000000, 0x035a026f00000000, 0x350b804b00000000, + 0xe52ada6e00000000, 0xd37b584a00000000, 0x8988de2700000000, + 0xbfd95c0300000000, 0x3d6ed3fc00000000, 0x0b3f51d800000000, + 0x51ccd7b500000000, 0x679d559100000000, 0x14a5b99100000000, + 0x22f43bb500000000, 0x7807bdd800000000, 0x4e563ffc00000000, + 0xcce1b00300000000, 0xfab0322700000000, 0xa043b44a00000000, + 0x9612366e00000000, 0x8c66d89600000000, 0xba375ab200000000, + 0xe0c4dcdf00000000, 0xd6955efb00000000, 0x5422d10400000000, + 0x6273532000000000, 0x3880d54d00000000, 0x0ed1576900000000, + 0x7de9bb6900000000, 0x4bb8394d00000000, 0x114bbf2000000000, + 0x271a3d0400000000, 0xa5adb2fb00000000, 0x93fc30df00000000, + 0xc90fb6b200000000, 0xff5e349600000000, 0x2f7f6eb300000000, + 0x192eec9700000000, 0x43dd6afa00000000, 0x758ce8de00000000, + 0xf73b672100000000, 0xc16ae50500000000, 0x9b99636800000000, + 0xadc8e14c00000000, 0xdef00d4c00000000, 0xe8a18f6800000000, + 0xb252090500000000, 0x84038b2100000000, 0x06b404de00000000, + 0x30e586fa00000000, 0x6a16009700000000, 0x5c4782b300000000, + 0xca55b4dd00000000, 0xfc0436f900000000, 0xa6f7b09400000000, + 0x90a632b000000000, 0x1211bd4f00000000, 0x24403f6b00000000, + 0x7eb3b90600000000, 0x48e23b2200000000, 0x3bdad72200000000, + 0x0d8b550600000000, 0x5778d36b00000000, 0x6129514f00000000, + 0xe39edeb000000000, 0xd5cf5c9400000000, 0x8f3cdaf900000000, + 0xb96d58dd00000000, 0x694c02f800000000, 0x5f1d80dc00000000, + 0x05ee06b100000000, 0x33bf849500000000, 0xb1080b6a00000000, + 0x8759894e00000000, 0xddaa0f2300000000, 0xebfb8d0700000000, + 0x98c3610700000000, 0xae92e32300000000, 0xf461654e00000000, + 0xc230e76a00000000, 0x4087689500000000, 0x76d6eab100000000, + 0x2c256cdc00000000, 0x1a74eef800000000, 0x59cbc1f600000000, + 0x6f9a43d200000000, 0x3569c5bf00000000, 0x0338479b00000000, + 0x818fc86400000000, 0xb7de4a4000000000, 0xed2dcc2d00000000, + 0xdb7c4e0900000000, 0xa844a20900000000, 0x9e15202d00000000, + 0xc4e6a64000000000, 0xf2b7246400000000, 0x7000ab9b00000000, + 0x465129bf00000000, 0x1ca2afd200000000, 0x2af32df600000000, + 0xfad277d300000000, 0xcc83f5f700000000, 0x9670739a00000000, + 0xa021f1be00000000, 0x22967e4100000000, 0x14c7fc6500000000, + 0x4e347a0800000000, 0x7865f82c00000000, 0x0b5d142c00000000, + 0x3d0c960800000000, 0x67ff106500000000, 0x51ae924100000000, + 0xd3191dbe00000000, 0xe5489f9a00000000, 0xbfbb19f700000000, + 0x89ea9bd300000000, 0x1ff8adbd00000000, 0x29a92f9900000000, + 0x735aa9f400000000, 0x450b2bd000000000, 0xc7bca42f00000000, + 0xf1ed260b00000000, 0xab1ea06600000000, 0x9d4f224200000000, + 0xee77ce4200000000, 0xd8264c6600000000, 0x82d5ca0b00000000, + 0xb484482f00000000, 0x3633c7d000000000, 0x006245f400000000, + 0x5a91c39900000000, 0x6cc041bd00000000, 0xbce11b9800000000, + 0x8ab099bc00000000, 0xd0431fd100000000, 0xe6129df500000000, + 0x64a5120a00000000, 0x52f4902e00000000, 0x0807164300000000, + 0x3e56946700000000, 0x4d6e786700000000, 0x7b3ffa4300000000, + 0x21cc7c2e00000000, 0x179dfe0a00000000, 0x952a71f500000000, + 0xa37bf3d100000000, 0xf98875bc00000000, 0xcfd9f79800000000, + 0xd5ad196000000000, 0xe3fc9b4400000000, 0xb90f1d2900000000, + 0x8f5e9f0d00000000, 0x0de910f200000000, 0x3bb892d600000000, + 0x614b14bb00000000, 0x571a969f00000000, 0x24227a9f00000000, + 0x1273f8bb00000000, 0x48807ed600000000, 0x7ed1fcf200000000, + 0xfc66730d00000000, 0xca37f12900000000, 0x90c4774400000000, + 0xa695f56000000000, 0x76b4af4500000000, 0x40e52d6100000000, + 0x1a16ab0c00000000, 0x2c47292800000000, 0xaef0a6d700000000, + 0x98a124f300000000, 0xc252a29e00000000, 0xf40320ba00000000, + 0x873bccba00000000, 0xb16a4e9e00000000, 0xeb99c8f300000000, + 0xddc84ad700000000, 0x5f7fc52800000000, 0x692e470c00000000, + 0x33ddc16100000000, 0x058c434500000000, 0x939e752b00000000, + 0xa5cff70f00000000, 0xff3c716200000000, 0xc96df34600000000, + 0x4bda7cb900000000, 0x7d8bfe9d00000000, 0x277878f000000000, + 0x1129fad400000000, 0x621116d400000000, 0x544094f000000000, + 0x0eb3129d00000000, 0x38e290b900000000, 0xba551f4600000000, + 0x8c049d6200000000, 0xd6f71b0f00000000, 0xe0a6992b00000000, + 0x3087c30e00000000, 0x06d6412a00000000, 0x5c25c74700000000, + 0x6a74456300000000, 0xe8c3ca9c00000000, 0xde9248b800000000, + 0x8461ced500000000, 0xb2304cf100000000, 0xc108a0f100000000, + 0xf75922d500000000, 0xadaaa4b800000000, 0x9bfb269c00000000, + 0x194ca96300000000, 0x2f1d2b4700000000, 0x75eead2a00000000, + 0x43bf2f0e00000000}, + {0x0000000000000000, 0xc8179ecf00000000, 0xd1294d4400000000, + 0x193ed38b00000000, 0xa2539a8800000000, 0x6a44044700000000, + 0x737ad7cc00000000, 0xbb6d490300000000, 0x05a145ca00000000, + 0xcdb6db0500000000, 0xd488088e00000000, 0x1c9f964100000000, + 0xa7f2df4200000000, 0x6fe5418d00000000, 0x76db920600000000, + 0xbecc0cc900000000, 0x4b44fa4f00000000, 0x8353648000000000, + 0x9a6db70b00000000, 0x527a29c400000000, 0xe91760c700000000, + 0x2100fe0800000000, 0x383e2d8300000000, 0xf029b34c00000000, + 0x4ee5bf8500000000, 0x86f2214a00000000, 0x9fccf2c100000000, + 0x57db6c0e00000000, 0xecb6250d00000000, 0x24a1bbc200000000, + 0x3d9f684900000000, 0xf588f68600000000, 0x9688f49f00000000, + 0x5e9f6a5000000000, 0x47a1b9db00000000, 0x8fb6271400000000, + 0x34db6e1700000000, 0xfcccf0d800000000, 0xe5f2235300000000, + 0x2de5bd9c00000000, 0x9329b15500000000, 0x5b3e2f9a00000000, + 0x4200fc1100000000, 0x8a1762de00000000, 0x317a2bdd00000000, + 0xf96db51200000000, 0xe053669900000000, 0x2844f85600000000, + 0xddcc0ed000000000, 0x15db901f00000000, 0x0ce5439400000000, + 0xc4f2dd5b00000000, 0x7f9f945800000000, 0xb7880a9700000000, + 0xaeb6d91c00000000, 0x66a147d300000000, 0xd86d4b1a00000000, + 0x107ad5d500000000, 0x0944065e00000000, 0xc153989100000000, + 0x7a3ed19200000000, 0xb2294f5d00000000, 0xab179cd600000000, + 0x6300021900000000, 0x6d1798e400000000, 0xa500062b00000000, + 0xbc3ed5a000000000, 0x74294b6f00000000, 0xcf44026c00000000, + 0x07539ca300000000, 0x1e6d4f2800000000, 0xd67ad1e700000000, + 0x68b6dd2e00000000, 0xa0a143e100000000, 0xb99f906a00000000, + 0x71880ea500000000, 0xcae547a600000000, 0x02f2d96900000000, + 0x1bcc0ae200000000, 0xd3db942d00000000, 0x265362ab00000000, + 0xee44fc6400000000, 0xf77a2fef00000000, 0x3f6db12000000000, + 0x8400f82300000000, 0x4c1766ec00000000, 0x5529b56700000000, + 0x9d3e2ba800000000, 0x23f2276100000000, 0xebe5b9ae00000000, + 0xf2db6a2500000000, 0x3accf4ea00000000, 0x81a1bde900000000, + 0x49b6232600000000, 0x5088f0ad00000000, 0x989f6e6200000000, + 0xfb9f6c7b00000000, 0x3388f2b400000000, 0x2ab6213f00000000, + 0xe2a1bff000000000, 0x59ccf6f300000000, 0x91db683c00000000, + 0x88e5bbb700000000, 0x40f2257800000000, 0xfe3e29b100000000, + 0x3629b77e00000000, 0x2f1764f500000000, 0xe700fa3a00000000, + 0x5c6db33900000000, 0x947a2df600000000, 0x8d44fe7d00000000, + 0x455360b200000000, 0xb0db963400000000, 0x78cc08fb00000000, + 0x61f2db7000000000, 0xa9e545bf00000000, 0x12880cbc00000000, + 0xda9f927300000000, 0xc3a141f800000000, 0x0bb6df3700000000, + 0xb57ad3fe00000000, 0x7d6d4d3100000000, 0x64539eba00000000, + 0xac44007500000000, 0x1729497600000000, 0xdf3ed7b900000000, + 0xc600043200000000, 0x0e179afd00000000, 0x9b28411200000000, + 0x533fdfdd00000000, 0x4a010c5600000000, 0x8216929900000000, + 0x397bdb9a00000000, 0xf16c455500000000, 0xe85296de00000000, + 0x2045081100000000, 0x9e8904d800000000, 0x569e9a1700000000, + 0x4fa0499c00000000, 0x87b7d75300000000, 0x3cda9e5000000000, + 0xf4cd009f00000000, 0xedf3d31400000000, 0x25e44ddb00000000, + 0xd06cbb5d00000000, 0x187b259200000000, 0x0145f61900000000, + 0xc95268d600000000, 0x723f21d500000000, 0xba28bf1a00000000, + 0xa3166c9100000000, 0x6b01f25e00000000, 0xd5cdfe9700000000, + 0x1dda605800000000, 0x04e4b3d300000000, 0xccf32d1c00000000, + 0x779e641f00000000, 0xbf89fad000000000, 0xa6b7295b00000000, + 0x6ea0b79400000000, 0x0da0b58d00000000, 0xc5b72b4200000000, + 0xdc89f8c900000000, 0x149e660600000000, 0xaff32f0500000000, + 0x67e4b1ca00000000, 0x7eda624100000000, 0xb6cdfc8e00000000, + 0x0801f04700000000, 0xc0166e8800000000, 0xd928bd0300000000, + 0x113f23cc00000000, 0xaa526acf00000000, 0x6245f40000000000, + 0x7b7b278b00000000, 0xb36cb94400000000, 0x46e44fc200000000, + 0x8ef3d10d00000000, 0x97cd028600000000, 0x5fda9c4900000000, + 0xe4b7d54a00000000, 0x2ca04b8500000000, 0x359e980e00000000, + 0xfd8906c100000000, 0x43450a0800000000, 0x8b5294c700000000, + 0x926c474c00000000, 0x5a7bd98300000000, 0xe116908000000000, + 0x29010e4f00000000, 0x303fddc400000000, 0xf828430b00000000, + 0xf63fd9f600000000, 0x3e28473900000000, 0x271694b200000000, + 0xef010a7d00000000, 0x546c437e00000000, 0x9c7bddb100000000, + 0x85450e3a00000000, 0x4d5290f500000000, 0xf39e9c3c00000000, + 0x3b8902f300000000, 0x22b7d17800000000, 0xeaa04fb700000000, + 0x51cd06b400000000, 0x99da987b00000000, 0x80e44bf000000000, + 0x48f3d53f00000000, 0xbd7b23b900000000, 0x756cbd7600000000, + 0x6c526efd00000000, 0xa445f03200000000, 0x1f28b93100000000, + 0xd73f27fe00000000, 0xce01f47500000000, 0x06166aba00000000, + 0xb8da667300000000, 0x70cdf8bc00000000, 0x69f32b3700000000, + 0xa1e4b5f800000000, 0x1a89fcfb00000000, 0xd29e623400000000, + 0xcba0b1bf00000000, 0x03b72f7000000000, 0x60b72d6900000000, + 0xa8a0b3a600000000, 0xb19e602d00000000, 0x7989fee200000000, + 0xc2e4b7e100000000, 0x0af3292e00000000, 0x13cdfaa500000000, + 0xdbda646a00000000, 0x651668a300000000, 0xad01f66c00000000, + 0xb43f25e700000000, 0x7c28bb2800000000, 0xc745f22b00000000, + 0x0f526ce400000000, 0x166cbf6f00000000, 0xde7b21a000000000, + 0x2bf3d72600000000, 0xe3e449e900000000, 0xfada9a6200000000, + 0x32cd04ad00000000, 0x89a04dae00000000, 0x41b7d36100000000, + 0x588900ea00000000, 0x909e9e2500000000, 0x2e5292ec00000000, + 0xe6450c2300000000, 0xff7bdfa800000000, 0x376c416700000000, + 0x8c01086400000000, 0x441696ab00000000, 0x5d28452000000000, + 0x953fdbef00000000}, + {0x0000000000000000, 0x95d4709500000000, 0x6baf90f100000000, + 0xfe7be06400000000, 0x9758503800000000, 0x028c20ad00000000, + 0xfcf7c0c900000000, 0x6923b05c00000000, 0x2eb1a07000000000, + 0xbb65d0e500000000, 0x451e308100000000, 0xd0ca401400000000, + 0xb9e9f04800000000, 0x2c3d80dd00000000, 0xd24660b900000000, + 0x4792102c00000000, 0x5c6241e100000000, 0xc9b6317400000000, + 0x37cdd11000000000, 0xa219a18500000000, 0xcb3a11d900000000, + 0x5eee614c00000000, 0xa095812800000000, 0x3541f1bd00000000, + 0x72d3e19100000000, 0xe707910400000000, 0x197c716000000000, + 0x8ca801f500000000, 0xe58bb1a900000000, 0x705fc13c00000000, + 0x8e24215800000000, 0x1bf051cd00000000, 0xf9c2f31900000000, + 0x6c16838c00000000, 0x926d63e800000000, 0x07b9137d00000000, + 0x6e9aa32100000000, 0xfb4ed3b400000000, 0x053533d000000000, + 0x90e1434500000000, 0xd773536900000000, 0x42a723fc00000000, + 0xbcdcc39800000000, 0x2908b30d00000000, 0x402b035100000000, + 0xd5ff73c400000000, 0x2b8493a000000000, 0xbe50e33500000000, + 0xa5a0b2f800000000, 0x3074c26d00000000, 0xce0f220900000000, + 0x5bdb529c00000000, 0x32f8e2c000000000, 0xa72c925500000000, + 0x5957723100000000, 0xcc8302a400000000, 0x8b11128800000000, + 0x1ec5621d00000000, 0xe0be827900000000, 0x756af2ec00000000, + 0x1c4942b000000000, 0x899d322500000000, 0x77e6d24100000000, + 0xe232a2d400000000, 0xf285e73300000000, 0x675197a600000000, + 0x992a77c200000000, 0x0cfe075700000000, 0x65ddb70b00000000, + 0xf009c79e00000000, 0x0e7227fa00000000, 0x9ba6576f00000000, + 0xdc34474300000000, 0x49e037d600000000, 0xb79bd7b200000000, + 0x224fa72700000000, 0x4b6c177b00000000, 0xdeb867ee00000000, + 0x20c3878a00000000, 0xb517f71f00000000, 0xaee7a6d200000000, + 0x3b33d64700000000, 0xc548362300000000, 0x509c46b600000000, + 0x39bff6ea00000000, 0xac6b867f00000000, 0x5210661b00000000, + 0xc7c4168e00000000, 0x805606a200000000, 0x1582763700000000, + 0xebf9965300000000, 0x7e2de6c600000000, 0x170e569a00000000, + 0x82da260f00000000, 0x7ca1c66b00000000, 0xe975b6fe00000000, + 0x0b47142a00000000, 0x9e9364bf00000000, 0x60e884db00000000, + 0xf53cf44e00000000, 0x9c1f441200000000, 0x09cb348700000000, + 0xf7b0d4e300000000, 0x6264a47600000000, 0x25f6b45a00000000, + 0xb022c4cf00000000, 0x4e5924ab00000000, 0xdb8d543e00000000, + 0xb2aee46200000000, 0x277a94f700000000, 0xd901749300000000, + 0x4cd5040600000000, 0x572555cb00000000, 0xc2f1255e00000000, + 0x3c8ac53a00000000, 0xa95eb5af00000000, 0xc07d05f300000000, + 0x55a9756600000000, 0xabd2950200000000, 0x3e06e59700000000, + 0x7994f5bb00000000, 0xec40852e00000000, 0x123b654a00000000, + 0x87ef15df00000000, 0xeecca58300000000, 0x7b18d51600000000, + 0x8563357200000000, 0x10b745e700000000, 0xe40bcf6700000000, + 0x71dfbff200000000, 0x8fa45f9600000000, 0x1a702f0300000000, + 0x73539f5f00000000, 0xe687efca00000000, 0x18fc0fae00000000, + 0x8d287f3b00000000, 0xcaba6f1700000000, 0x5f6e1f8200000000, + 0xa115ffe600000000, 0x34c18f7300000000, 0x5de23f2f00000000, + 0xc8364fba00000000, 0x364dafde00000000, 0xa399df4b00000000, + 0xb8698e8600000000, 0x2dbdfe1300000000, 0xd3c61e7700000000, + 0x46126ee200000000, 0x2f31debe00000000, 0xbae5ae2b00000000, + 0x449e4e4f00000000, 0xd14a3eda00000000, 0x96d82ef600000000, + 0x030c5e6300000000, 0xfd77be0700000000, 0x68a3ce9200000000, + 0x01807ece00000000, 0x94540e5b00000000, 0x6a2fee3f00000000, + 0xfffb9eaa00000000, 0x1dc93c7e00000000, 0x881d4ceb00000000, + 0x7666ac8f00000000, 0xe3b2dc1a00000000, 0x8a916c4600000000, + 0x1f451cd300000000, 0xe13efcb700000000, 0x74ea8c2200000000, + 0x33789c0e00000000, 0xa6acec9b00000000, 0x58d70cff00000000, + 0xcd037c6a00000000, 0xa420cc3600000000, 0x31f4bca300000000, + 0xcf8f5cc700000000, 0x5a5b2c5200000000, 0x41ab7d9f00000000, + 0xd47f0d0a00000000, 0x2a04ed6e00000000, 0xbfd09dfb00000000, + 0xd6f32da700000000, 0x43275d3200000000, 0xbd5cbd5600000000, + 0x2888cdc300000000, 0x6f1addef00000000, 0xfacead7a00000000, + 0x04b54d1e00000000, 0x91613d8b00000000, 0xf8428dd700000000, + 0x6d96fd4200000000, 0x93ed1d2600000000, 0x06396db300000000, + 0x168e285400000000, 0x835a58c100000000, 0x7d21b8a500000000, + 0xe8f5c83000000000, 0x81d6786c00000000, 0x140208f900000000, + 0xea79e89d00000000, 0x7fad980800000000, 0x383f882400000000, + 0xadebf8b100000000, 0x539018d500000000, 0xc644684000000000, + 0xaf67d81c00000000, 0x3ab3a88900000000, 0xc4c848ed00000000, + 0x511c387800000000, 0x4aec69b500000000, 0xdf38192000000000, + 0x2143f94400000000, 0xb49789d100000000, 0xddb4398d00000000, + 0x4860491800000000, 0xb61ba97c00000000, 0x23cfd9e900000000, + 0x645dc9c500000000, 0xf189b95000000000, 0x0ff2593400000000, + 0x9a2629a100000000, 0xf30599fd00000000, 0x66d1e96800000000, + 0x98aa090c00000000, 0x0d7e799900000000, 0xef4cdb4d00000000, + 0x7a98abd800000000, 0x84e34bbc00000000, 0x11373b2900000000, + 0x78148b7500000000, 0xedc0fbe000000000, 0x13bb1b8400000000, + 0x866f6b1100000000, 0xc1fd7b3d00000000, 0x54290ba800000000, + 0xaa52ebcc00000000, 0x3f869b5900000000, 0x56a52b0500000000, + 0xc3715b9000000000, 0x3d0abbf400000000, 0xa8decb6100000000, + 0xb32e9aac00000000, 0x26faea3900000000, 0xd8810a5d00000000, + 0x4d557ac800000000, 0x2476ca9400000000, 0xb1a2ba0100000000, + 0x4fd95a6500000000, 0xda0d2af000000000, 0x9d9f3adc00000000, + 0x084b4a4900000000, 0xf630aa2d00000000, 0x63e4dab800000000, + 0x0ac76ae400000000, 0x9f131a7100000000, 0x6168fa1500000000, + 0xf4bc8a8000000000}, + {0x0000000000000000, 0x1f17f08000000000, 0x7f2891da00000000, + 0x603f615a00000000, 0xbf56536e00000000, 0xa041a3ee00000000, + 0xc07ec2b400000000, 0xdf69323400000000, 0x7eada6dc00000000, + 0x61ba565c00000000, 0x0185370600000000, 0x1e92c78600000000, + 0xc1fbf5b200000000, 0xdeec053200000000, 0xbed3646800000000, + 0xa1c494e800000000, 0xbd5c3c6200000000, 0xa24bcce200000000, + 0xc274adb800000000, 0xdd635d3800000000, 0x020a6f0c00000000, + 0x1d1d9f8c00000000, 0x7d22fed600000000, 0x62350e5600000000, + 0xc3f19abe00000000, 0xdce66a3e00000000, 0xbcd90b6400000000, + 0xa3cefbe400000000, 0x7ca7c9d000000000, 0x63b0395000000000, + 0x038f580a00000000, 0x1c98a88a00000000, 0x7ab978c400000000, + 0x65ae884400000000, 0x0591e91e00000000, 0x1a86199e00000000, + 0xc5ef2baa00000000, 0xdaf8db2a00000000, 0xbac7ba7000000000, + 0xa5d04af000000000, 0x0414de1800000000, 0x1b032e9800000000, + 0x7b3c4fc200000000, 0x642bbf4200000000, 0xbb428d7600000000, + 0xa4557df600000000, 0xc46a1cac00000000, 0xdb7dec2c00000000, + 0xc7e544a600000000, 0xd8f2b42600000000, 0xb8cdd57c00000000, + 0xa7da25fc00000000, 0x78b317c800000000, 0x67a4e74800000000, + 0x079b861200000000, 0x188c769200000000, 0xb948e27a00000000, + 0xa65f12fa00000000, 0xc66073a000000000, 0xd977832000000000, + 0x061eb11400000000, 0x1909419400000000, 0x793620ce00000000, + 0x6621d04e00000000, 0xb574805300000000, 0xaa6370d300000000, + 0xca5c118900000000, 0xd54be10900000000, 0x0a22d33d00000000, + 0x153523bd00000000, 0x750a42e700000000, 0x6a1db26700000000, + 0xcbd9268f00000000, 0xd4ced60f00000000, 0xb4f1b75500000000, + 0xabe647d500000000, 0x748f75e100000000, 0x6b98856100000000, + 0x0ba7e43b00000000, 0x14b014bb00000000, 0x0828bc3100000000, + 0x173f4cb100000000, 0x77002deb00000000, 0x6817dd6b00000000, + 0xb77eef5f00000000, 0xa8691fdf00000000, 0xc8567e8500000000, + 0xd7418e0500000000, 0x76851aed00000000, 0x6992ea6d00000000, + 0x09ad8b3700000000, 0x16ba7bb700000000, 0xc9d3498300000000, + 0xd6c4b90300000000, 0xb6fbd85900000000, 0xa9ec28d900000000, + 0xcfcdf89700000000, 0xd0da081700000000, 0xb0e5694d00000000, + 0xaff299cd00000000, 0x709babf900000000, 0x6f8c5b7900000000, + 0x0fb33a2300000000, 0x10a4caa300000000, 0xb1605e4b00000000, + 0xae77aecb00000000, 0xce48cf9100000000, 0xd15f3f1100000000, + 0x0e360d2500000000, 0x1121fda500000000, 0x711e9cff00000000, + 0x6e096c7f00000000, 0x7291c4f500000000, 0x6d86347500000000, + 0x0db9552f00000000, 0x12aea5af00000000, 0xcdc7979b00000000, + 0xd2d0671b00000000, 0xb2ef064100000000, 0xadf8f6c100000000, + 0x0c3c622900000000, 0x132b92a900000000, 0x7314f3f300000000, + 0x6c03037300000000, 0xb36a314700000000, 0xac7dc1c700000000, + 0xcc42a09d00000000, 0xd355501d00000000, 0x6ae900a700000000, + 0x75fef02700000000, 0x15c1917d00000000, 0x0ad661fd00000000, + 0xd5bf53c900000000, 0xcaa8a34900000000, 0xaa97c21300000000, + 0xb580329300000000, 0x1444a67b00000000, 0x0b5356fb00000000, + 0x6b6c37a100000000, 0x747bc72100000000, 0xab12f51500000000, + 0xb405059500000000, 0xd43a64cf00000000, 0xcb2d944f00000000, + 0xd7b53cc500000000, 0xc8a2cc4500000000, 0xa89dad1f00000000, + 0xb78a5d9f00000000, 0x68e36fab00000000, 0x77f49f2b00000000, + 0x17cbfe7100000000, 0x08dc0ef100000000, 0xa9189a1900000000, + 0xb60f6a9900000000, 0xd6300bc300000000, 0xc927fb4300000000, + 0x164ec97700000000, 0x095939f700000000, 0x696658ad00000000, + 0x7671a82d00000000, 0x1050786300000000, 0x0f4788e300000000, + 0x6f78e9b900000000, 0x706f193900000000, 0xaf062b0d00000000, + 0xb011db8d00000000, 0xd02ebad700000000, 0xcf394a5700000000, + 0x6efddebf00000000, 0x71ea2e3f00000000, 0x11d54f6500000000, + 0x0ec2bfe500000000, 0xd1ab8dd100000000, 0xcebc7d5100000000, + 0xae831c0b00000000, 0xb194ec8b00000000, 0xad0c440100000000, + 0xb21bb48100000000, 0xd224d5db00000000, 0xcd33255b00000000, + 0x125a176f00000000, 0x0d4de7ef00000000, 0x6d7286b500000000, + 0x7265763500000000, 0xd3a1e2dd00000000, 0xccb6125d00000000, + 0xac89730700000000, 0xb39e838700000000, 0x6cf7b1b300000000, + 0x73e0413300000000, 0x13df206900000000, 0x0cc8d0e900000000, + 0xdf9d80f400000000, 0xc08a707400000000, 0xa0b5112e00000000, + 0xbfa2e1ae00000000, 0x60cbd39a00000000, 0x7fdc231a00000000, + 0x1fe3424000000000, 0x00f4b2c000000000, 0xa130262800000000, + 0xbe27d6a800000000, 0xde18b7f200000000, 0xc10f477200000000, + 0x1e66754600000000, 0x017185c600000000, 0x614ee49c00000000, + 0x7e59141c00000000, 0x62c1bc9600000000, 0x7dd64c1600000000, + 0x1de92d4c00000000, 0x02feddcc00000000, 0xdd97eff800000000, + 0xc2801f7800000000, 0xa2bf7e2200000000, 0xbda88ea200000000, + 0x1c6c1a4a00000000, 0x037beaca00000000, 0x63448b9000000000, + 0x7c537b1000000000, 0xa33a492400000000, 0xbc2db9a400000000, + 0xdc12d8fe00000000, 0xc305287e00000000, 0xa524f83000000000, + 0xba3308b000000000, 0xda0c69ea00000000, 0xc51b996a00000000, + 0x1a72ab5e00000000, 0x05655bde00000000, 0x655a3a8400000000, + 0x7a4dca0400000000, 0xdb895eec00000000, 0xc49eae6c00000000, + 0xa4a1cf3600000000, 0xbbb63fb600000000, 0x64df0d8200000000, + 0x7bc8fd0200000000, 0x1bf79c5800000000, 0x04e06cd800000000, + 0x1878c45200000000, 0x076f34d200000000, 0x6750558800000000, + 0x7847a50800000000, 0xa72e973c00000000, 0xb83967bc00000000, + 0xd80606e600000000, 0xc711f66600000000, 0x66d5628e00000000, + 0x79c2920e00000000, 0x19fdf35400000000, 0x06ea03d400000000, + 0xd98331e000000000, 0xc694c16000000000, 0xa6aba03a00000000, + 0xb9bc50ba00000000}, + {0x0000000000000000, 0xe2fd888d00000000, 0x85fd60c000000000, + 0x6700e84d00000000, 0x4bfdb05b00000000, 0xa90038d600000000, + 0xce00d09b00000000, 0x2cfd581600000000, 0x96fa61b700000000, + 0x7407e93a00000000, 0x1307017700000000, 0xf1fa89fa00000000, + 0xdd07d1ec00000000, 0x3ffa596100000000, 0x58fab12c00000000, + 0xba0739a100000000, 0x6df3b2b500000000, 0x8f0e3a3800000000, + 0xe80ed27500000000, 0x0af35af800000000, 0x260e02ee00000000, + 0xc4f38a6300000000, 0xa3f3622e00000000, 0x410eeaa300000000, + 0xfb09d30200000000, 0x19f45b8f00000000, 0x7ef4b3c200000000, + 0x9c093b4f00000000, 0xb0f4635900000000, 0x5209ebd400000000, + 0x3509039900000000, 0xd7f48b1400000000, 0x9be014b000000000, + 0x791d9c3d00000000, 0x1e1d747000000000, 0xfce0fcfd00000000, + 0xd01da4eb00000000, 0x32e02c6600000000, 0x55e0c42b00000000, + 0xb71d4ca600000000, 0x0d1a750700000000, 0xefe7fd8a00000000, + 0x88e715c700000000, 0x6a1a9d4a00000000, 0x46e7c55c00000000, + 0xa41a4dd100000000, 0xc31aa59c00000000, 0x21e72d1100000000, + 0xf613a60500000000, 0x14ee2e8800000000, 0x73eec6c500000000, + 0x91134e4800000000, 0xbdee165e00000000, 0x5f139ed300000000, + 0x3813769e00000000, 0xdaeefe1300000000, 0x60e9c7b200000000, + 0x82144f3f00000000, 0xe514a77200000000, 0x07e92fff00000000, + 0x2b1477e900000000, 0xc9e9ff6400000000, 0xaee9172900000000, + 0x4c149fa400000000, 0x77c758bb00000000, 0x953ad03600000000, + 0xf23a387b00000000, 0x10c7b0f600000000, 0x3c3ae8e000000000, + 0xdec7606d00000000, 0xb9c7882000000000, 0x5b3a00ad00000000, + 0xe13d390c00000000, 0x03c0b18100000000, 0x64c059cc00000000, + 0x863dd14100000000, 0xaac0895700000000, 0x483d01da00000000, + 0x2f3de99700000000, 0xcdc0611a00000000, 0x1a34ea0e00000000, + 0xf8c9628300000000, 0x9fc98ace00000000, 0x7d34024300000000, + 0x51c95a5500000000, 0xb334d2d800000000, 0xd4343a9500000000, + 0x36c9b21800000000, 0x8cce8bb900000000, 0x6e33033400000000, + 0x0933eb7900000000, 0xebce63f400000000, 0xc7333be200000000, + 0x25ceb36f00000000, 0x42ce5b2200000000, 0xa033d3af00000000, + 0xec274c0b00000000, 0x0edac48600000000, 0x69da2ccb00000000, + 0x8b27a44600000000, 0xa7dafc5000000000, 0x452774dd00000000, + 0x22279c9000000000, 0xc0da141d00000000, 0x7add2dbc00000000, + 0x9820a53100000000, 0xff204d7c00000000, 0x1dddc5f100000000, + 0x31209de700000000, 0xd3dd156a00000000, 0xb4ddfd2700000000, + 0x562075aa00000000, 0x81d4febe00000000, 0x6329763300000000, + 0x04299e7e00000000, 0xe6d416f300000000, 0xca294ee500000000, + 0x28d4c66800000000, 0x4fd42e2500000000, 0xad29a6a800000000, + 0x172e9f0900000000, 0xf5d3178400000000, 0x92d3ffc900000000, + 0x702e774400000000, 0x5cd32f5200000000, 0xbe2ea7df00000000, + 0xd92e4f9200000000, 0x3bd3c71f00000000, 0xaf88c0ad00000000, + 0x4d75482000000000, 0x2a75a06d00000000, 0xc88828e000000000, + 0xe47570f600000000, 0x0688f87b00000000, 0x6188103600000000, + 0x837598bb00000000, 0x3972a11a00000000, 0xdb8f299700000000, + 0xbc8fc1da00000000, 0x5e72495700000000, 0x728f114100000000, + 0x907299cc00000000, 0xf772718100000000, 0x158ff90c00000000, + 0xc27b721800000000, 0x2086fa9500000000, 0x478612d800000000, + 0xa57b9a5500000000, 0x8986c24300000000, 0x6b7b4ace00000000, + 0x0c7ba28300000000, 0xee862a0e00000000, 0x548113af00000000, + 0xb67c9b2200000000, 0xd17c736f00000000, 0x3381fbe200000000, + 0x1f7ca3f400000000, 0xfd812b7900000000, 0x9a81c33400000000, + 0x787c4bb900000000, 0x3468d41d00000000, 0xd6955c9000000000, + 0xb195b4dd00000000, 0x53683c5000000000, 0x7f95644600000000, + 0x9d68eccb00000000, 0xfa68048600000000, 0x18958c0b00000000, + 0xa292b5aa00000000, 0x406f3d2700000000, 0x276fd56a00000000, + 0xc5925de700000000, 0xe96f05f100000000, 0x0b928d7c00000000, + 0x6c92653100000000, 0x8e6fedbc00000000, 0x599b66a800000000, + 0xbb66ee2500000000, 0xdc66066800000000, 0x3e9b8ee500000000, + 0x1266d6f300000000, 0xf09b5e7e00000000, 0x979bb63300000000, + 0x75663ebe00000000, 0xcf61071f00000000, 0x2d9c8f9200000000, + 0x4a9c67df00000000, 0xa861ef5200000000, 0x849cb74400000000, + 0x66613fc900000000, 0x0161d78400000000, 0xe39c5f0900000000, + 0xd84f981600000000, 0x3ab2109b00000000, 0x5db2f8d600000000, + 0xbf4f705b00000000, 0x93b2284d00000000, 0x714fa0c000000000, + 0x164f488d00000000, 0xf4b2c00000000000, 0x4eb5f9a100000000, + 0xac48712c00000000, 0xcb48996100000000, 0x29b511ec00000000, + 0x054849fa00000000, 0xe7b5c17700000000, 0x80b5293a00000000, + 0x6248a1b700000000, 0xb5bc2aa300000000, 0x5741a22e00000000, + 0x30414a6300000000, 0xd2bcc2ee00000000, 0xfe419af800000000, + 0x1cbc127500000000, 0x7bbcfa3800000000, 0x994172b500000000, + 0x23464b1400000000, 0xc1bbc39900000000, 0xa6bb2bd400000000, + 0x4446a35900000000, 0x68bbfb4f00000000, 0x8a4673c200000000, + 0xed469b8f00000000, 0x0fbb130200000000, 0x43af8ca600000000, + 0xa152042b00000000, 0xc652ec6600000000, 0x24af64eb00000000, + 0x08523cfd00000000, 0xeaafb47000000000, 0x8daf5c3d00000000, + 0x6f52d4b000000000, 0xd555ed1100000000, 0x37a8659c00000000, + 0x50a88dd100000000, 0xb255055c00000000, 0x9ea85d4a00000000, + 0x7c55d5c700000000, 0x1b553d8a00000000, 0xf9a8b50700000000, + 0x2e5c3e1300000000, 0xcca1b69e00000000, 0xaba15ed300000000, + 0x495cd65e00000000, 0x65a18e4800000000, 0x875c06c500000000, + 0xe05cee8800000000, 0x02a1660500000000, 0xb8a65fa400000000, + 0x5a5bd72900000000, 0x3d5b3f6400000000, 0xdfa6b7e900000000, + 0xf35befff00000000, 0x11a6677200000000, 0x76a68f3f00000000, + 0x945b07b200000000}, + {0x0000000000000000, 0xa90b894e00000000, 0x5217129d00000000, + 0xfb1c9bd300000000, 0xe52855e100000000, 0x4c23dcaf00000000, + 0xb73f477c00000000, 0x1e34ce3200000000, 0x8b57db1900000000, + 0x225c525700000000, 0xd940c98400000000, 0x704b40ca00000000, + 0x6e7f8ef800000000, 0xc77407b600000000, 0x3c689c6500000000, + 0x9563152b00000000, 0x16afb63300000000, 0xbfa43f7d00000000, + 0x44b8a4ae00000000, 0xedb32de000000000, 0xf387e3d200000000, + 0x5a8c6a9c00000000, 0xa190f14f00000000, 0x089b780100000000, + 0x9df86d2a00000000, 0x34f3e46400000000, 0xcfef7fb700000000, + 0x66e4f6f900000000, 0x78d038cb00000000, 0xd1dbb18500000000, + 0x2ac72a5600000000, 0x83cca31800000000, 0x2c5e6d6700000000, + 0x8555e42900000000, 0x7e497ffa00000000, 0xd742f6b400000000, + 0xc976388600000000, 0x607db1c800000000, 0x9b612a1b00000000, + 0x326aa35500000000, 0xa709b67e00000000, 0x0e023f3000000000, + 0xf51ea4e300000000, 0x5c152dad00000000, 0x4221e39f00000000, + 0xeb2a6ad100000000, 0x1036f10200000000, 0xb93d784c00000000, + 0x3af1db5400000000, 0x93fa521a00000000, 0x68e6c9c900000000, + 0xc1ed408700000000, 0xdfd98eb500000000, 0x76d207fb00000000, + 0x8dce9c2800000000, 0x24c5156600000000, 0xb1a6004d00000000, + 0x18ad890300000000, 0xe3b112d000000000, 0x4aba9b9e00000000, + 0x548e55ac00000000, 0xfd85dce200000000, 0x0699473100000000, + 0xaf92ce7f00000000, 0x58bcdace00000000, 0xf1b7538000000000, + 0x0aabc85300000000, 0xa3a0411d00000000, 0xbd948f2f00000000, + 0x149f066100000000, 0xef839db200000000, 0x468814fc00000000, + 0xd3eb01d700000000, 0x7ae0889900000000, 0x81fc134a00000000, + 0x28f79a0400000000, 0x36c3543600000000, 0x9fc8dd7800000000, + 0x64d446ab00000000, 0xcddfcfe500000000, 0x4e136cfd00000000, + 0xe718e5b300000000, 0x1c047e6000000000, 0xb50ff72e00000000, + 0xab3b391c00000000, 0x0230b05200000000, 0xf92c2b8100000000, + 0x5027a2cf00000000, 0xc544b7e400000000, 0x6c4f3eaa00000000, + 0x9753a57900000000, 0x3e582c3700000000, 0x206ce20500000000, + 0x89676b4b00000000, 0x727bf09800000000, 0xdb7079d600000000, + 0x74e2b7a900000000, 0xdde93ee700000000, 0x26f5a53400000000, + 0x8ffe2c7a00000000, 0x91cae24800000000, 0x38c16b0600000000, + 0xc3ddf0d500000000, 0x6ad6799b00000000, 0xffb56cb000000000, + 0x56bee5fe00000000, 0xada27e2d00000000, 0x04a9f76300000000, + 0x1a9d395100000000, 0xb396b01f00000000, 0x488a2bcc00000000, + 0xe181a28200000000, 0x624d019a00000000, 0xcb4688d400000000, + 0x305a130700000000, 0x99519a4900000000, 0x8765547b00000000, + 0x2e6edd3500000000, 0xd57246e600000000, 0x7c79cfa800000000, + 0xe91ada8300000000, 0x401153cd00000000, 0xbb0dc81e00000000, + 0x1206415000000000, 0x0c328f6200000000, 0xa539062c00000000, + 0x5e259dff00000000, 0xf72e14b100000000, 0xf17ec44600000000, + 0x58754d0800000000, 0xa369d6db00000000, 0x0a625f9500000000, + 0x145691a700000000, 0xbd5d18e900000000, 0x4641833a00000000, + 0xef4a0a7400000000, 0x7a291f5f00000000, 0xd322961100000000, + 0x283e0dc200000000, 0x8135848c00000000, 0x9f014abe00000000, + 0x360ac3f000000000, 0xcd16582300000000, 0x641dd16d00000000, + 0xe7d1727500000000, 0x4edafb3b00000000, 0xb5c660e800000000, + 0x1ccde9a600000000, 0x02f9279400000000, 0xabf2aeda00000000, + 0x50ee350900000000, 0xf9e5bc4700000000, 0x6c86a96c00000000, + 0xc58d202200000000, 0x3e91bbf100000000, 0x979a32bf00000000, + 0x89aefc8d00000000, 0x20a575c300000000, 0xdbb9ee1000000000, + 0x72b2675e00000000, 0xdd20a92100000000, 0x742b206f00000000, + 0x8f37bbbc00000000, 0x263c32f200000000, 0x3808fcc000000000, + 0x9103758e00000000, 0x6a1fee5d00000000, 0xc314671300000000, + 0x5677723800000000, 0xff7cfb7600000000, 0x046060a500000000, + 0xad6be9eb00000000, 0xb35f27d900000000, 0x1a54ae9700000000, + 0xe148354400000000, 0x4843bc0a00000000, 0xcb8f1f1200000000, + 0x6284965c00000000, 0x99980d8f00000000, 0x309384c100000000, + 0x2ea74af300000000, 0x87acc3bd00000000, 0x7cb0586e00000000, + 0xd5bbd12000000000, 0x40d8c40b00000000, 0xe9d34d4500000000, + 0x12cfd69600000000, 0xbbc45fd800000000, 0xa5f091ea00000000, + 0x0cfb18a400000000, 0xf7e7837700000000, 0x5eec0a3900000000, + 0xa9c21e8800000000, 0x00c997c600000000, 0xfbd50c1500000000, + 0x52de855b00000000, 0x4cea4b6900000000, 0xe5e1c22700000000, + 0x1efd59f400000000, 0xb7f6d0ba00000000, 0x2295c59100000000, + 0x8b9e4cdf00000000, 0x7082d70c00000000, 0xd9895e4200000000, + 0xc7bd907000000000, 0x6eb6193e00000000, 0x95aa82ed00000000, + 0x3ca10ba300000000, 0xbf6da8bb00000000, 0x166621f500000000, + 0xed7aba2600000000, 0x4471336800000000, 0x5a45fd5a00000000, + 0xf34e741400000000, 0x0852efc700000000, 0xa159668900000000, + 0x343a73a200000000, 0x9d31faec00000000, 0x662d613f00000000, + 0xcf26e87100000000, 0xd112264300000000, 0x7819af0d00000000, + 0x830534de00000000, 0x2a0ebd9000000000, 0x859c73ef00000000, + 0x2c97faa100000000, 0xd78b617200000000, 0x7e80e83c00000000, + 0x60b4260e00000000, 0xc9bfaf4000000000, 0x32a3349300000000, + 0x9ba8bddd00000000, 0x0ecba8f600000000, 0xa7c021b800000000, + 0x5cdcba6b00000000, 0xf5d7332500000000, 0xebe3fd1700000000, + 0x42e8745900000000, 0xb9f4ef8a00000000, 0x10ff66c400000000, + 0x9333c5dc00000000, 0x3a384c9200000000, 0xc124d74100000000, + 0x682f5e0f00000000, 0x761b903d00000000, 0xdf10197300000000, + 0x240c82a000000000, 0x8d070bee00000000, 0x18641ec500000000, + 0xb16f978b00000000, 0x4a730c5800000000, 0xe378851600000000, + 0xfd4c4b2400000000, 0x5447c26a00000000, 0xaf5b59b900000000, + 0x0650d0f700000000}, + {0x0000000000000000, 0x479244af00000000, 0xcf22f88500000000, + 0x88b0bc2a00000000, 0xdf4381d000000000, 0x98d1c57f00000000, + 0x1061795500000000, 0x57f33dfa00000000, 0xff81737a00000000, + 0xb81337d500000000, 0x30a38bff00000000, 0x7731cf5000000000, + 0x20c2f2aa00000000, 0x6750b60500000000, 0xefe00a2f00000000, + 0xa8724e8000000000, 0xfe03e7f400000000, 0xb991a35b00000000, + 0x31211f7100000000, 0x76b35bde00000000, 0x2140662400000000, + 0x66d2228b00000000, 0xee629ea100000000, 0xa9f0da0e00000000, + 0x0182948e00000000, 0x4610d02100000000, 0xcea06c0b00000000, + 0x893228a400000000, 0xdec1155e00000000, 0x995351f100000000, + 0x11e3eddb00000000, 0x5671a97400000000, 0xbd01bf3200000000, + 0xfa93fb9d00000000, 0x722347b700000000, 0x35b1031800000000, + 0x62423ee200000000, 0x25d07a4d00000000, 0xad60c66700000000, + 0xeaf282c800000000, 0x4280cc4800000000, 0x051288e700000000, + 0x8da234cd00000000, 0xca30706200000000, 0x9dc34d9800000000, + 0xda51093700000000, 0x52e1b51d00000000, 0x1573f1b200000000, + 0x430258c600000000, 0x04901c6900000000, 0x8c20a04300000000, + 0xcbb2e4ec00000000, 0x9c41d91600000000, 0xdbd39db900000000, + 0x5363219300000000, 0x14f1653c00000000, 0xbc832bbc00000000, + 0xfb116f1300000000, 0x73a1d33900000000, 0x3433979600000000, + 0x63c0aa6c00000000, 0x2452eec300000000, 0xace252e900000000, + 0xeb70164600000000, 0x7a037e6500000000, 0x3d913aca00000000, + 0xb52186e000000000, 0xf2b3c24f00000000, 0xa540ffb500000000, + 0xe2d2bb1a00000000, 0x6a62073000000000, 0x2df0439f00000000, + 0x85820d1f00000000, 0xc21049b000000000, 0x4aa0f59a00000000, + 0x0d32b13500000000, 0x5ac18ccf00000000, 0x1d53c86000000000, + 0x95e3744a00000000, 0xd27130e500000000, 0x8400999100000000, + 0xc392dd3e00000000, 0x4b22611400000000, 0x0cb025bb00000000, + 0x5b43184100000000, 0x1cd15cee00000000, 0x9461e0c400000000, + 0xd3f3a46b00000000, 0x7b81eaeb00000000, 0x3c13ae4400000000, + 0xb4a3126e00000000, 0xf33156c100000000, 0xa4c26b3b00000000, + 0xe3502f9400000000, 0x6be093be00000000, 0x2c72d71100000000, + 0xc702c15700000000, 0x809085f800000000, 0x082039d200000000, + 0x4fb27d7d00000000, 0x1841408700000000, 0x5fd3042800000000, + 0xd763b80200000000, 0x90f1fcad00000000, 0x3883b22d00000000, + 0x7f11f68200000000, 0xf7a14aa800000000, 0xb0330e0700000000, + 0xe7c033fd00000000, 0xa052775200000000, 0x28e2cb7800000000, + 0x6f708fd700000000, 0x390126a300000000, 0x7e93620c00000000, + 0xf623de2600000000, 0xb1b19a8900000000, 0xe642a77300000000, + 0xa1d0e3dc00000000, 0x29605ff600000000, 0x6ef21b5900000000, + 0xc68055d900000000, 0x8112117600000000, 0x09a2ad5c00000000, + 0x4e30e9f300000000, 0x19c3d40900000000, 0x5e5190a600000000, + 0xd6e12c8c00000000, 0x9173682300000000, 0xf406fcca00000000, + 0xb394b86500000000, 0x3b24044f00000000, 0x7cb640e000000000, + 0x2b457d1a00000000, 0x6cd739b500000000, 0xe467859f00000000, + 0xa3f5c13000000000, 0x0b878fb000000000, 0x4c15cb1f00000000, + 0xc4a5773500000000, 0x8337339a00000000, 0xd4c40e6000000000, + 0x93564acf00000000, 0x1be6f6e500000000, 0x5c74b24a00000000, + 0x0a051b3e00000000, 0x4d975f9100000000, 0xc527e3bb00000000, + 0x82b5a71400000000, 0xd5469aee00000000, 0x92d4de4100000000, + 0x1a64626b00000000, 0x5df626c400000000, 0xf584684400000000, + 0xb2162ceb00000000, 0x3aa690c100000000, 0x7d34d46e00000000, + 0x2ac7e99400000000, 0x6d55ad3b00000000, 0xe5e5111100000000, + 0xa27755be00000000, 0x490743f800000000, 0x0e95075700000000, + 0x8625bb7d00000000, 0xc1b7ffd200000000, 0x9644c22800000000, + 0xd1d6868700000000, 0x59663aad00000000, 0x1ef47e0200000000, + 0xb686308200000000, 0xf114742d00000000, 0x79a4c80700000000, + 0x3e368ca800000000, 0x69c5b15200000000, 0x2e57f5fd00000000, + 0xa6e749d700000000, 0xe1750d7800000000, 0xb704a40c00000000, + 0xf096e0a300000000, 0x78265c8900000000, 0x3fb4182600000000, + 0x684725dc00000000, 0x2fd5617300000000, 0xa765dd5900000000, + 0xe0f799f600000000, 0x4885d77600000000, 0x0f1793d900000000, + 0x87a72ff300000000, 0xc0356b5c00000000, 0x97c656a600000000, + 0xd054120900000000, 0x58e4ae2300000000, 0x1f76ea8c00000000, + 0x8e0582af00000000, 0xc997c60000000000, 0x41277a2a00000000, + 0x06b53e8500000000, 0x5146037f00000000, 0x16d447d000000000, + 0x9e64fbfa00000000, 0xd9f6bf5500000000, 0x7184f1d500000000, + 0x3616b57a00000000, 0xbea6095000000000, 0xf9344dff00000000, + 0xaec7700500000000, 0xe95534aa00000000, 0x61e5888000000000, + 0x2677cc2f00000000, 0x7006655b00000000, 0x379421f400000000, + 0xbf249dde00000000, 0xf8b6d97100000000, 0xaf45e48b00000000, + 0xe8d7a02400000000, 0x60671c0e00000000, 0x27f558a100000000, + 0x8f87162100000000, 0xc815528e00000000, 0x40a5eea400000000, + 0x0737aa0b00000000, 0x50c497f100000000, 0x1756d35e00000000, + 0x9fe66f7400000000, 0xd8742bdb00000000, 0x33043d9d00000000, + 0x7496793200000000, 0xfc26c51800000000, 0xbbb481b700000000, + 0xec47bc4d00000000, 0xabd5f8e200000000, 0x236544c800000000, + 0x64f7006700000000, 0xcc854ee700000000, 0x8b170a4800000000, + 0x03a7b66200000000, 0x4435f2cd00000000, 0x13c6cf3700000000, + 0x54548b9800000000, 0xdce437b200000000, 0x9b76731d00000000, + 0xcd07da6900000000, 0x8a959ec600000000, 0x022522ec00000000, + 0x45b7664300000000, 0x12445bb900000000, 0x55d61f1600000000, + 0xdd66a33c00000000, 0x9af4e79300000000, 0x3286a91300000000, + 0x7514edbc00000000, 0xfda4519600000000, 0xba36153900000000, + 0xedc528c300000000, 0xaa576c6c00000000, 0x22e7d04600000000, + 0x657594e900000000}}; + +#else /* W == 4 */ + +local const z_crc_t FAR crc_braid_table[][256] = { + {0x00000000, 0x65673b46, 0xcace768c, 0xafa94dca, 0x4eedeb59, + 0x2b8ad01f, 0x84239dd5, 0xe144a693, 0x9ddbd6b2, 0xf8bcedf4, + 0x5715a03e, 0x32729b78, 0xd3363deb, 0xb65106ad, 0x19f84b67, + 0x7c9f7021, 0xe0c6ab25, 0x85a19063, 0x2a08dda9, 0x4f6fe6ef, + 0xae2b407c, 0xcb4c7b3a, 0x64e536f0, 0x01820db6, 0x7d1d7d97, + 0x187a46d1, 0xb7d30b1b, 0xd2b4305d, 0x33f096ce, 0x5697ad88, + 0xf93ee042, 0x9c59db04, 0x1afc500b, 0x7f9b6b4d, 0xd0322687, + 0xb5551dc1, 0x5411bb52, 0x31768014, 0x9edfcdde, 0xfbb8f698, + 0x872786b9, 0xe240bdff, 0x4de9f035, 0x288ecb73, 0xc9ca6de0, + 0xacad56a6, 0x03041b6c, 0x6663202a, 0xfa3afb2e, 0x9f5dc068, + 0x30f48da2, 0x5593b6e4, 0xb4d71077, 0xd1b02b31, 0x7e1966fb, + 0x1b7e5dbd, 0x67e12d9c, 0x028616da, 0xad2f5b10, 0xc8486056, + 0x290cc6c5, 0x4c6bfd83, 0xe3c2b049, 0x86a58b0f, 0x35f8a016, + 0x509f9b50, 0xff36d69a, 0x9a51eddc, 0x7b154b4f, 0x1e727009, + 0xb1db3dc3, 0xd4bc0685, 0xa82376a4, 0xcd444de2, 0x62ed0028, + 0x078a3b6e, 0xe6ce9dfd, 0x83a9a6bb, 0x2c00eb71, 0x4967d037, + 0xd53e0b33, 0xb0593075, 0x1ff07dbf, 0x7a9746f9, 0x9bd3e06a, + 0xfeb4db2c, 0x511d96e6, 0x347aada0, 0x48e5dd81, 0x2d82e6c7, + 0x822bab0d, 0xe74c904b, 0x060836d8, 0x636f0d9e, 0xccc64054, + 0xa9a17b12, 0x2f04f01d, 0x4a63cb5b, 0xe5ca8691, 0x80adbdd7, + 0x61e91b44, 0x048e2002, 0xab276dc8, 0xce40568e, 0xb2df26af, + 0xd7b81de9, 0x78115023, 0x1d766b65, 0xfc32cdf6, 0x9955f6b0, + 0x36fcbb7a, 0x539b803c, 0xcfc25b38, 0xaaa5607e, 0x050c2db4, + 0x606b16f2, 0x812fb061, 0xe4488b27, 0x4be1c6ed, 0x2e86fdab, + 0x52198d8a, 0x377eb6cc, 0x98d7fb06, 0xfdb0c040, 0x1cf466d3, + 0x79935d95, 0xd63a105f, 0xb35d2b19, 0x6bf1402c, 0x0e967b6a, + 0xa13f36a0, 0xc4580de6, 0x251cab75, 0x407b9033, 0xefd2ddf9, + 0x8ab5e6bf, 0xf62a969e, 0x934dadd8, 0x3ce4e012, 0x5983db54, + 0xb8c77dc7, 0xdda04681, 0x72090b4b, 0x176e300d, 0x8b37eb09, + 0xee50d04f, 0x41f99d85, 0x249ea6c3, 0xc5da0050, 0xa0bd3b16, + 0x0f1476dc, 0x6a734d9a, 0x16ec3dbb, 0x738b06fd, 0xdc224b37, + 0xb9457071, 0x5801d6e2, 0x3d66eda4, 0x92cfa06e, 0xf7a89b28, + 0x710d1027, 0x146a2b61, 0xbbc366ab, 0xdea45ded, 0x3fe0fb7e, + 0x5a87c038, 0xf52e8df2, 0x9049b6b4, 0xecd6c695, 0x89b1fdd3, + 0x2618b019, 0x437f8b5f, 0xa23b2dcc, 0xc75c168a, 0x68f55b40, + 0x0d926006, 0x91cbbb02, 0xf4ac8044, 0x5b05cd8e, 0x3e62f6c8, + 0xdf26505b, 0xba416b1d, 0x15e826d7, 0x708f1d91, 0x0c106db0, + 0x697756f6, 0xc6de1b3c, 0xa3b9207a, 0x42fd86e9, 0x279abdaf, + 0x8833f065, 0xed54cb23, 0x5e09e03a, 0x3b6edb7c, 0x94c796b6, + 0xf1a0adf0, 0x10e40b63, 0x75833025, 0xda2a7def, 0xbf4d46a9, + 0xc3d23688, 0xa6b50dce, 0x091c4004, 0x6c7b7b42, 0x8d3fddd1, + 0xe858e697, 0x47f1ab5d, 0x2296901b, 0xbecf4b1f, 0xdba87059, + 0x74013d93, 0x116606d5, 0xf022a046, 0x95459b00, 0x3aecd6ca, + 0x5f8bed8c, 0x23149dad, 0x4673a6eb, 0xe9daeb21, 0x8cbdd067, + 0x6df976f4, 0x089e4db2, 0xa7370078, 0xc2503b3e, 0x44f5b031, + 0x21928b77, 0x8e3bc6bd, 0xeb5cfdfb, 0x0a185b68, 0x6f7f602e, + 0xc0d62de4, 0xa5b116a2, 0xd92e6683, 0xbc495dc5, 0x13e0100f, + 0x76872b49, 0x97c38dda, 0xf2a4b69c, 0x5d0dfb56, 0x386ac010, + 0xa4331b14, 0xc1542052, 0x6efd6d98, 0x0b9a56de, 0xeadef04d, + 0x8fb9cb0b, 0x201086c1, 0x4577bd87, 0x39e8cda6, 0x5c8ff6e0, + 0xf326bb2a, 0x9641806c, 0x770526ff, 0x12621db9, 0xbdcb5073, + 0xd8ac6b35}, + {0x00000000, 0xd7e28058, 0x74b406f1, 0xa35686a9, 0xe9680de2, + 0x3e8a8dba, 0x9ddc0b13, 0x4a3e8b4b, 0x09a11d85, 0xde439ddd, + 0x7d151b74, 0xaaf79b2c, 0xe0c91067, 0x372b903f, 0x947d1696, + 0x439f96ce, 0x13423b0a, 0xc4a0bb52, 0x67f63dfb, 0xb014bda3, + 0xfa2a36e8, 0x2dc8b6b0, 0x8e9e3019, 0x597cb041, 0x1ae3268f, + 0xcd01a6d7, 0x6e57207e, 0xb9b5a026, 0xf38b2b6d, 0x2469ab35, + 0x873f2d9c, 0x50ddadc4, 0x26847614, 0xf166f64c, 0x523070e5, + 0x85d2f0bd, 0xcfec7bf6, 0x180efbae, 0xbb587d07, 0x6cbafd5f, + 0x2f256b91, 0xf8c7ebc9, 0x5b916d60, 0x8c73ed38, 0xc64d6673, + 0x11afe62b, 0xb2f96082, 0x651be0da, 0x35c64d1e, 0xe224cd46, + 0x41724bef, 0x9690cbb7, 0xdcae40fc, 0x0b4cc0a4, 0xa81a460d, + 0x7ff8c655, 0x3c67509b, 0xeb85d0c3, 0x48d3566a, 0x9f31d632, + 0xd50f5d79, 0x02eddd21, 0xa1bb5b88, 0x7659dbd0, 0x4d08ec28, + 0x9aea6c70, 0x39bcead9, 0xee5e6a81, 0xa460e1ca, 0x73826192, + 0xd0d4e73b, 0x07366763, 0x44a9f1ad, 0x934b71f5, 0x301df75c, + 0xe7ff7704, 0xadc1fc4f, 0x7a237c17, 0xd975fabe, 0x0e977ae6, + 0x5e4ad722, 0x89a8577a, 0x2afed1d3, 0xfd1c518b, 0xb722dac0, + 0x60c05a98, 0xc396dc31, 0x14745c69, 0x57ebcaa7, 0x80094aff, + 0x235fcc56, 0xf4bd4c0e, 0xbe83c745, 0x6961471d, 0xca37c1b4, + 0x1dd541ec, 0x6b8c9a3c, 0xbc6e1a64, 0x1f389ccd, 0xc8da1c95, + 0x82e497de, 0x55061786, 0xf650912f, 0x21b21177, 0x622d87b9, + 0xb5cf07e1, 0x16998148, 0xc17b0110, 0x8b458a5b, 0x5ca70a03, + 0xfff18caa, 0x28130cf2, 0x78cea136, 0xaf2c216e, 0x0c7aa7c7, + 0xdb98279f, 0x91a6acd4, 0x46442c8c, 0xe512aa25, 0x32f02a7d, + 0x716fbcb3, 0xa68d3ceb, 0x05dbba42, 0xd2393a1a, 0x9807b151, + 0x4fe53109, 0xecb3b7a0, 0x3b5137f8, 0x9a11d850, 0x4df35808, + 0xeea5dea1, 0x39475ef9, 0x7379d5b2, 0xa49b55ea, 0x07cdd343, + 0xd02f531b, 0x93b0c5d5, 0x4452458d, 0xe704c324, 0x30e6437c, + 0x7ad8c837, 0xad3a486f, 0x0e6ccec6, 0xd98e4e9e, 0x8953e35a, + 0x5eb16302, 0xfde7e5ab, 0x2a0565f3, 0x603beeb8, 0xb7d96ee0, + 0x148fe849, 0xc36d6811, 0x80f2fedf, 0x57107e87, 0xf446f82e, + 0x23a47876, 0x699af33d, 0xbe787365, 0x1d2ef5cc, 0xcacc7594, + 0xbc95ae44, 0x6b772e1c, 0xc821a8b5, 0x1fc328ed, 0x55fda3a6, + 0x821f23fe, 0x2149a557, 0xf6ab250f, 0xb534b3c1, 0x62d63399, + 0xc180b530, 0x16623568, 0x5c5cbe23, 0x8bbe3e7b, 0x28e8b8d2, + 0xff0a388a, 0xafd7954e, 0x78351516, 0xdb6393bf, 0x0c8113e7, + 0x46bf98ac, 0x915d18f4, 0x320b9e5d, 0xe5e91e05, 0xa67688cb, + 0x71940893, 0xd2c28e3a, 0x05200e62, 0x4f1e8529, 0x98fc0571, + 0x3baa83d8, 0xec480380, 0xd7193478, 0x00fbb420, 0xa3ad3289, + 0x744fb2d1, 0x3e71399a, 0xe993b9c2, 0x4ac53f6b, 0x9d27bf33, + 0xdeb829fd, 0x095aa9a5, 0xaa0c2f0c, 0x7deeaf54, 0x37d0241f, + 0xe032a447, 0x436422ee, 0x9486a2b6, 0xc45b0f72, 0x13b98f2a, + 0xb0ef0983, 0x670d89db, 0x2d330290, 0xfad182c8, 0x59870461, + 0x8e658439, 0xcdfa12f7, 0x1a1892af, 0xb94e1406, 0x6eac945e, + 0x24921f15, 0xf3709f4d, 0x502619e4, 0x87c499bc, 0xf19d426c, + 0x267fc234, 0x8529449d, 0x52cbc4c5, 0x18f54f8e, 0xcf17cfd6, + 0x6c41497f, 0xbba3c927, 0xf83c5fe9, 0x2fdedfb1, 0x8c885918, + 0x5b6ad940, 0x1154520b, 0xc6b6d253, 0x65e054fa, 0xb202d4a2, + 0xe2df7966, 0x353df93e, 0x966b7f97, 0x4189ffcf, 0x0bb77484, + 0xdc55f4dc, 0x7f037275, 0xa8e1f22d, 0xeb7e64e3, 0x3c9ce4bb, + 0x9fca6212, 0x4828e24a, 0x02166901, 0xd5f4e959, 0x76a26ff0, + 0xa140efa8}, + {0x00000000, 0xef52b6e1, 0x05d46b83, 0xea86dd62, 0x0ba8d706, + 0xe4fa61e7, 0x0e7cbc85, 0xe12e0a64, 0x1751ae0c, 0xf80318ed, + 0x1285c58f, 0xfdd7736e, 0x1cf9790a, 0xf3abcfeb, 0x192d1289, + 0xf67fa468, 0x2ea35c18, 0xc1f1eaf9, 0x2b77379b, 0xc425817a, + 0x250b8b1e, 0xca593dff, 0x20dfe09d, 0xcf8d567c, 0x39f2f214, + 0xd6a044f5, 0x3c269997, 0xd3742f76, 0x325a2512, 0xdd0893f3, + 0x378e4e91, 0xd8dcf870, 0x5d46b830, 0xb2140ed1, 0x5892d3b3, + 0xb7c06552, 0x56ee6f36, 0xb9bcd9d7, 0x533a04b5, 0xbc68b254, + 0x4a17163c, 0xa545a0dd, 0x4fc37dbf, 0xa091cb5e, 0x41bfc13a, + 0xaeed77db, 0x446baab9, 0xab391c58, 0x73e5e428, 0x9cb752c9, + 0x76318fab, 0x9963394a, 0x784d332e, 0x971f85cf, 0x7d9958ad, + 0x92cbee4c, 0x64b44a24, 0x8be6fcc5, 0x616021a7, 0x8e329746, + 0x6f1c9d22, 0x804e2bc3, 0x6ac8f6a1, 0x859a4040, 0xba8d7060, + 0x55dfc681, 0xbf591be3, 0x500bad02, 0xb125a766, 0x5e771187, + 0xb4f1cce5, 0x5ba37a04, 0xaddcde6c, 0x428e688d, 0xa808b5ef, + 0x475a030e, 0xa674096a, 0x4926bf8b, 0xa3a062e9, 0x4cf2d408, + 0x942e2c78, 0x7b7c9a99, 0x91fa47fb, 0x7ea8f11a, 0x9f86fb7e, + 0x70d44d9f, 0x9a5290fd, 0x7500261c, 0x837f8274, 0x6c2d3495, + 0x86abe9f7, 0x69f95f16, 0x88d75572, 0x6785e393, 0x8d033ef1, + 0x62518810, 0xe7cbc850, 0x08997eb1, 0xe21fa3d3, 0x0d4d1532, + 0xec631f56, 0x0331a9b7, 0xe9b774d5, 0x06e5c234, 0xf09a665c, + 0x1fc8d0bd, 0xf54e0ddf, 0x1a1cbb3e, 0xfb32b15a, 0x146007bb, + 0xfee6dad9, 0x11b46c38, 0xc9689448, 0x263a22a9, 0xccbcffcb, + 0x23ee492a, 0xc2c0434e, 0x2d92f5af, 0xc71428cd, 0x28469e2c, + 0xde393a44, 0x316b8ca5, 0xdbed51c7, 0x34bfe726, 0xd591ed42, + 0x3ac35ba3, 0xd04586c1, 0x3f173020, 0xae6be681, 0x41395060, + 0xabbf8d02, 0x44ed3be3, 0xa5c33187, 0x4a918766, 0xa0175a04, + 0x4f45ece5, 0xb93a488d, 0x5668fe6c, 0xbcee230e, 0x53bc95ef, + 0xb2929f8b, 0x5dc0296a, 0xb746f408, 0x581442e9, 0x80c8ba99, + 0x6f9a0c78, 0x851cd11a, 0x6a4e67fb, 0x8b606d9f, 0x6432db7e, + 0x8eb4061c, 0x61e6b0fd, 0x97991495, 0x78cba274, 0x924d7f16, + 0x7d1fc9f7, 0x9c31c393, 0x73637572, 0x99e5a810, 0x76b71ef1, + 0xf32d5eb1, 0x1c7fe850, 0xf6f93532, 0x19ab83d3, 0xf88589b7, + 0x17d73f56, 0xfd51e234, 0x120354d5, 0xe47cf0bd, 0x0b2e465c, + 0xe1a89b3e, 0x0efa2ddf, 0xefd427bb, 0x0086915a, 0xea004c38, + 0x0552fad9, 0xdd8e02a9, 0x32dcb448, 0xd85a692a, 0x3708dfcb, + 0xd626d5af, 0x3974634e, 0xd3f2be2c, 0x3ca008cd, 0xcadfaca5, + 0x258d1a44, 0xcf0bc726, 0x205971c7, 0xc1777ba3, 0x2e25cd42, + 0xc4a31020, 0x2bf1a6c1, 0x14e696e1, 0xfbb42000, 0x1132fd62, + 0xfe604b83, 0x1f4e41e7, 0xf01cf706, 0x1a9a2a64, 0xf5c89c85, + 0x03b738ed, 0xece58e0c, 0x0663536e, 0xe931e58f, 0x081fefeb, + 0xe74d590a, 0x0dcb8468, 0xe2993289, 0x3a45caf9, 0xd5177c18, + 0x3f91a17a, 0xd0c3179b, 0x31ed1dff, 0xdebfab1e, 0x3439767c, + 0xdb6bc09d, 0x2d1464f5, 0xc246d214, 0x28c00f76, 0xc792b997, + 0x26bcb3f3, 0xc9ee0512, 0x2368d870, 0xcc3a6e91, 0x49a02ed1, + 0xa6f29830, 0x4c744552, 0xa326f3b3, 0x4208f9d7, 0xad5a4f36, + 0x47dc9254, 0xa88e24b5, 0x5ef180dd, 0xb1a3363c, 0x5b25eb5e, + 0xb4775dbf, 0x555957db, 0xba0be13a, 0x508d3c58, 0xbfdf8ab9, + 0x670372c9, 0x8851c428, 0x62d7194a, 0x8d85afab, 0x6caba5cf, + 0x83f9132e, 0x697fce4c, 0x862d78ad, 0x7052dcc5, 0x9f006a24, + 0x7586b746, 0x9ad401a7, 0x7bfa0bc3, 0x94a8bd22, 0x7e2e6040, + 0x917cd6a1}, + {0x00000000, 0x87a6cb43, 0xd43c90c7, 0x539a5b84, 0x730827cf, + 0xf4aeec8c, 0xa734b708, 0x20927c4b, 0xe6104f9e, 0x61b684dd, + 0x322cdf59, 0xb58a141a, 0x95186851, 0x12bea312, 0x4124f896, + 0xc68233d5, 0x1751997d, 0x90f7523e, 0xc36d09ba, 0x44cbc2f9, + 0x6459beb2, 0xe3ff75f1, 0xb0652e75, 0x37c3e536, 0xf141d6e3, + 0x76e71da0, 0x257d4624, 0xa2db8d67, 0x8249f12c, 0x05ef3a6f, + 0x567561eb, 0xd1d3aaa8, 0x2ea332fa, 0xa905f9b9, 0xfa9fa23d, + 0x7d39697e, 0x5dab1535, 0xda0dde76, 0x899785f2, 0x0e314eb1, + 0xc8b37d64, 0x4f15b627, 0x1c8feda3, 0x9b2926e0, 0xbbbb5aab, + 0x3c1d91e8, 0x6f87ca6c, 0xe821012f, 0x39f2ab87, 0xbe5460c4, + 0xedce3b40, 0x6a68f003, 0x4afa8c48, 0xcd5c470b, 0x9ec61c8f, + 0x1960d7cc, 0xdfe2e419, 0x58442f5a, 0x0bde74de, 0x8c78bf9d, + 0xaceac3d6, 0x2b4c0895, 0x78d65311, 0xff709852, 0x5d4665f4, + 0xdae0aeb7, 0x897af533, 0x0edc3e70, 0x2e4e423b, 0xa9e88978, + 0xfa72d2fc, 0x7dd419bf, 0xbb562a6a, 0x3cf0e129, 0x6f6abaad, + 0xe8cc71ee, 0xc85e0da5, 0x4ff8c6e6, 0x1c629d62, 0x9bc45621, + 0x4a17fc89, 0xcdb137ca, 0x9e2b6c4e, 0x198da70d, 0x391fdb46, + 0xbeb91005, 0xed234b81, 0x6a8580c2, 0xac07b317, 0x2ba17854, + 0x783b23d0, 0xff9de893, 0xdf0f94d8, 0x58a95f9b, 0x0b33041f, + 0x8c95cf5c, 0x73e5570e, 0xf4439c4d, 0xa7d9c7c9, 0x207f0c8a, + 0x00ed70c1, 0x874bbb82, 0xd4d1e006, 0x53772b45, 0x95f51890, + 0x1253d3d3, 0x41c98857, 0xc66f4314, 0xe6fd3f5f, 0x615bf41c, + 0x32c1af98, 0xb56764db, 0x64b4ce73, 0xe3120530, 0xb0885eb4, + 0x372e95f7, 0x17bce9bc, 0x901a22ff, 0xc380797b, 0x4426b238, + 0x82a481ed, 0x05024aae, 0x5698112a, 0xd13eda69, 0xf1aca622, + 0x760a6d61, 0x259036e5, 0xa236fda6, 0xba8ccbe8, 0x3d2a00ab, + 0x6eb05b2f, 0xe916906c, 0xc984ec27, 0x4e222764, 0x1db87ce0, + 0x9a1eb7a3, 0x5c9c8476, 0xdb3a4f35, 0x88a014b1, 0x0f06dff2, + 0x2f94a3b9, 0xa83268fa, 0xfba8337e, 0x7c0ef83d, 0xaddd5295, + 0x2a7b99d6, 0x79e1c252, 0xfe470911, 0xded5755a, 0x5973be19, + 0x0ae9e59d, 0x8d4f2ede, 0x4bcd1d0b, 0xcc6bd648, 0x9ff18dcc, + 0x1857468f, 0x38c53ac4, 0xbf63f187, 0xecf9aa03, 0x6b5f6140, + 0x942ff912, 0x13893251, 0x401369d5, 0xc7b5a296, 0xe727dedd, + 0x6081159e, 0x331b4e1a, 0xb4bd8559, 0x723fb68c, 0xf5997dcf, + 0xa603264b, 0x21a5ed08, 0x01379143, 0x86915a00, 0xd50b0184, + 0x52adcac7, 0x837e606f, 0x04d8ab2c, 0x5742f0a8, 0xd0e43beb, + 0xf07647a0, 0x77d08ce3, 0x244ad767, 0xa3ec1c24, 0x656e2ff1, + 0xe2c8e4b2, 0xb152bf36, 0x36f47475, 0x1666083e, 0x91c0c37d, + 0xc25a98f9, 0x45fc53ba, 0xe7caae1c, 0x606c655f, 0x33f63edb, + 0xb450f598, 0x94c289d3, 0x13644290, 0x40fe1914, 0xc758d257, + 0x01dae182, 0x867c2ac1, 0xd5e67145, 0x5240ba06, 0x72d2c64d, + 0xf5740d0e, 0xa6ee568a, 0x21489dc9, 0xf09b3761, 0x773dfc22, + 0x24a7a7a6, 0xa3016ce5, 0x839310ae, 0x0435dbed, 0x57af8069, + 0xd0094b2a, 0x168b78ff, 0x912db3bc, 0xc2b7e838, 0x4511237b, + 0x65835f30, 0xe2259473, 0xb1bfcff7, 0x361904b4, 0xc9699ce6, + 0x4ecf57a5, 0x1d550c21, 0x9af3c762, 0xba61bb29, 0x3dc7706a, + 0x6e5d2bee, 0xe9fbe0ad, 0x2f79d378, 0xa8df183b, 0xfb4543bf, + 0x7ce388fc, 0x5c71f4b7, 0xdbd73ff4, 0x884d6470, 0x0febaf33, + 0xde38059b, 0x599eced8, 0x0a04955c, 0x8da25e1f, 0xad302254, + 0x2a96e917, 0x790cb293, 0xfeaa79d0, 0x38284a05, 0xbf8e8146, + 0xec14dac2, 0x6bb21181, 0x4b206dca, 0xcc86a689, 0x9f1cfd0d, + 0x18ba364e}}; + +local const z_word_t FAR crc_braid_big_table[][256] = { + {0x00000000, 0x43cba687, 0xc7903cd4, 0x845b9a53, 0xcf270873, + 0x8cecaef4, 0x08b734a7, 0x4b7c9220, 0x9e4f10e6, 0xdd84b661, + 0x59df2c32, 0x1a148ab5, 0x51681895, 0x12a3be12, 0x96f82441, + 0xd53382c6, 0x7d995117, 0x3e52f790, 0xba096dc3, 0xf9c2cb44, + 0xb2be5964, 0xf175ffe3, 0x752e65b0, 0x36e5c337, 0xe3d641f1, + 0xa01de776, 0x24467d25, 0x678ddba2, 0x2cf14982, 0x6f3aef05, + 0xeb617556, 0xa8aad3d1, 0xfa32a32e, 0xb9f905a9, 0x3da29ffa, + 0x7e69397d, 0x3515ab5d, 0x76de0dda, 0xf2859789, 0xb14e310e, + 0x647db3c8, 0x27b6154f, 0xa3ed8f1c, 0xe026299b, 0xab5abbbb, + 0xe8911d3c, 0x6cca876f, 0x2f0121e8, 0x87abf239, 0xc46054be, + 0x403bceed, 0x03f0686a, 0x488cfa4a, 0x0b475ccd, 0x8f1cc69e, + 0xccd76019, 0x19e4e2df, 0x5a2f4458, 0xde74de0b, 0x9dbf788c, + 0xd6c3eaac, 0x95084c2b, 0x1153d678, 0x529870ff, 0xf465465d, + 0xb7aee0da, 0x33f57a89, 0x703edc0e, 0x3b424e2e, 0x7889e8a9, + 0xfcd272fa, 0xbf19d47d, 0x6a2a56bb, 0x29e1f03c, 0xadba6a6f, + 0xee71cce8, 0xa50d5ec8, 0xe6c6f84f, 0x629d621c, 0x2156c49b, + 0x89fc174a, 0xca37b1cd, 0x4e6c2b9e, 0x0da78d19, 0x46db1f39, + 0x0510b9be, 0x814b23ed, 0xc280856a, 0x17b307ac, 0x5478a12b, + 0xd0233b78, 0x93e89dff, 0xd8940fdf, 0x9b5fa958, 0x1f04330b, + 0x5ccf958c, 0x0e57e573, 0x4d9c43f4, 0xc9c7d9a7, 0x8a0c7f20, + 0xc170ed00, 0x82bb4b87, 0x06e0d1d4, 0x452b7753, 0x9018f595, + 0xd3d35312, 0x5788c941, 0x14436fc6, 0x5f3ffde6, 0x1cf45b61, + 0x98afc132, 0xdb6467b5, 0x73ceb464, 0x300512e3, 0xb45e88b0, + 0xf7952e37, 0xbce9bc17, 0xff221a90, 0x7b7980c3, 0x38b22644, + 0xed81a482, 0xae4a0205, 0x2a119856, 0x69da3ed1, 0x22a6acf1, + 0x616d0a76, 0xe5369025, 0xa6fd36a2, 0xe8cb8cba, 0xab002a3d, + 0x2f5bb06e, 0x6c9016e9, 0x27ec84c9, 0x6427224e, 0xe07cb81d, + 0xa3b71e9a, 0x76849c5c, 0x354f3adb, 0xb114a088, 0xf2df060f, + 0xb9a3942f, 0xfa6832a8, 0x7e33a8fb, 0x3df80e7c, 0x9552ddad, + 0xd6997b2a, 0x52c2e179, 0x110947fe, 0x5a75d5de, 0x19be7359, + 0x9de5e90a, 0xde2e4f8d, 0x0b1dcd4b, 0x48d66bcc, 0xcc8df19f, + 0x8f465718, 0xc43ac538, 0x87f163bf, 0x03aaf9ec, 0x40615f6b, + 0x12f92f94, 0x51328913, 0xd5691340, 0x96a2b5c7, 0xddde27e7, + 0x9e158160, 0x1a4e1b33, 0x5985bdb4, 0x8cb63f72, 0xcf7d99f5, + 0x4b2603a6, 0x08eda521, 0x43913701, 0x005a9186, 0x84010bd5, + 0xc7caad52, 0x6f607e83, 0x2cabd804, 0xa8f04257, 0xeb3be4d0, + 0xa04776f0, 0xe38cd077, 0x67d74a24, 0x241ceca3, 0xf12f6e65, + 0xb2e4c8e2, 0x36bf52b1, 0x7574f436, 0x3e086616, 0x7dc3c091, + 0xf9985ac2, 0xba53fc45, 0x1caecae7, 0x5f656c60, 0xdb3ef633, + 0x98f550b4, 0xd389c294, 0x90426413, 0x1419fe40, 0x57d258c7, + 0x82e1da01, 0xc12a7c86, 0x4571e6d5, 0x06ba4052, 0x4dc6d272, + 0x0e0d74f5, 0x8a56eea6, 0xc99d4821, 0x61379bf0, 0x22fc3d77, + 0xa6a7a724, 0xe56c01a3, 0xae109383, 0xeddb3504, 0x6980af57, + 0x2a4b09d0, 0xff788b16, 0xbcb32d91, 0x38e8b7c2, 0x7b231145, + 0x305f8365, 0x739425e2, 0xf7cfbfb1, 0xb4041936, 0xe69c69c9, + 0xa557cf4e, 0x210c551d, 0x62c7f39a, 0x29bb61ba, 0x6a70c73d, + 0xee2b5d6e, 0xade0fbe9, 0x78d3792f, 0x3b18dfa8, 0xbf4345fb, + 0xfc88e37c, 0xb7f4715c, 0xf43fd7db, 0x70644d88, 0x33afeb0f, + 0x9b0538de, 0xd8ce9e59, 0x5c95040a, 0x1f5ea28d, 0x542230ad, + 0x17e9962a, 0x93b20c79, 0xd079aafe, 0x054a2838, 0x46818ebf, + 0xc2da14ec, 0x8111b26b, 0xca6d204b, 0x89a686cc, 0x0dfd1c9f, + 0x4e36ba18}, + {0x00000000, 0xe1b652ef, 0x836bd405, 0x62dd86ea, 0x06d7a80b, + 0xe761fae4, 0x85bc7c0e, 0x640a2ee1, 0x0cae5117, 0xed1803f8, + 0x8fc58512, 0x6e73d7fd, 0x0a79f91c, 0xebcfabf3, 0x89122d19, + 0x68a47ff6, 0x185ca32e, 0xf9eaf1c1, 0x9b37772b, 0x7a8125c4, + 0x1e8b0b25, 0xff3d59ca, 0x9de0df20, 0x7c568dcf, 0x14f2f239, + 0xf544a0d6, 0x9799263c, 0x762f74d3, 0x12255a32, 0xf39308dd, + 0x914e8e37, 0x70f8dcd8, 0x30b8465d, 0xd10e14b2, 0xb3d39258, + 0x5265c0b7, 0x366fee56, 0xd7d9bcb9, 0xb5043a53, 0x54b268bc, + 0x3c16174a, 0xdda045a5, 0xbf7dc34f, 0x5ecb91a0, 0x3ac1bf41, + 0xdb77edae, 0xb9aa6b44, 0x581c39ab, 0x28e4e573, 0xc952b79c, + 0xab8f3176, 0x4a396399, 0x2e334d78, 0xcf851f97, 0xad58997d, + 0x4ceecb92, 0x244ab464, 0xc5fce68b, 0xa7216061, 0x4697328e, + 0x229d1c6f, 0xc32b4e80, 0xa1f6c86a, 0x40409a85, 0x60708dba, + 0x81c6df55, 0xe31b59bf, 0x02ad0b50, 0x66a725b1, 0x8711775e, + 0xe5ccf1b4, 0x047aa35b, 0x6cdedcad, 0x8d688e42, 0xefb508a8, + 0x0e035a47, 0x6a0974a6, 0x8bbf2649, 0xe962a0a3, 0x08d4f24c, + 0x782c2e94, 0x999a7c7b, 0xfb47fa91, 0x1af1a87e, 0x7efb869f, + 0x9f4dd470, 0xfd90529a, 0x1c260075, 0x74827f83, 0x95342d6c, + 0xf7e9ab86, 0x165ff969, 0x7255d788, 0x93e38567, 0xf13e038d, + 0x10885162, 0x50c8cbe7, 0xb17e9908, 0xd3a31fe2, 0x32154d0d, + 0x561f63ec, 0xb7a93103, 0xd574b7e9, 0x34c2e506, 0x5c669af0, + 0xbdd0c81f, 0xdf0d4ef5, 0x3ebb1c1a, 0x5ab132fb, 0xbb076014, + 0xd9dae6fe, 0x386cb411, 0x489468c9, 0xa9223a26, 0xcbffbccc, + 0x2a49ee23, 0x4e43c0c2, 0xaff5922d, 0xcd2814c7, 0x2c9e4628, + 0x443a39de, 0xa58c6b31, 0xc751eddb, 0x26e7bf34, 0x42ed91d5, + 0xa35bc33a, 0xc18645d0, 0x2030173f, 0x81e66bae, 0x60503941, + 0x028dbfab, 0xe33bed44, 0x8731c3a5, 0x6687914a, 0x045a17a0, + 0xe5ec454f, 0x8d483ab9, 0x6cfe6856, 0x0e23eebc, 0xef95bc53, + 0x8b9f92b2, 0x6a29c05d, 0x08f446b7, 0xe9421458, 0x99bac880, + 0x780c9a6f, 0x1ad11c85, 0xfb674e6a, 0x9f6d608b, 0x7edb3264, + 0x1c06b48e, 0xfdb0e661, 0x95149997, 0x74a2cb78, 0x167f4d92, + 0xf7c91f7d, 0x93c3319c, 0x72756373, 0x10a8e599, 0xf11eb776, + 0xb15e2df3, 0x50e87f1c, 0x3235f9f6, 0xd383ab19, 0xb78985f8, + 0x563fd717, 0x34e251fd, 0xd5540312, 0xbdf07ce4, 0x5c462e0b, + 0x3e9ba8e1, 0xdf2dfa0e, 0xbb27d4ef, 0x5a918600, 0x384c00ea, + 0xd9fa5205, 0xa9028edd, 0x48b4dc32, 0x2a695ad8, 0xcbdf0837, + 0xafd526d6, 0x4e637439, 0x2cbef2d3, 0xcd08a03c, 0xa5acdfca, + 0x441a8d25, 0x26c70bcf, 0xc7715920, 0xa37b77c1, 0x42cd252e, + 0x2010a3c4, 0xc1a6f12b, 0xe196e614, 0x0020b4fb, 0x62fd3211, + 0x834b60fe, 0xe7414e1f, 0x06f71cf0, 0x642a9a1a, 0x859cc8f5, + 0xed38b703, 0x0c8ee5ec, 0x6e536306, 0x8fe531e9, 0xebef1f08, + 0x0a594de7, 0x6884cb0d, 0x893299e2, 0xf9ca453a, 0x187c17d5, + 0x7aa1913f, 0x9b17c3d0, 0xff1ded31, 0x1eabbfde, 0x7c763934, + 0x9dc06bdb, 0xf564142d, 0x14d246c2, 0x760fc028, 0x97b992c7, + 0xf3b3bc26, 0x1205eec9, 0x70d86823, 0x916e3acc, 0xd12ea049, + 0x3098f2a6, 0x5245744c, 0xb3f326a3, 0xd7f90842, 0x364f5aad, + 0x5492dc47, 0xb5248ea8, 0xdd80f15e, 0x3c36a3b1, 0x5eeb255b, + 0xbf5d77b4, 0xdb575955, 0x3ae10bba, 0x583c8d50, 0xb98adfbf, + 0xc9720367, 0x28c45188, 0x4a19d762, 0xabaf858d, 0xcfa5ab6c, + 0x2e13f983, 0x4cce7f69, 0xad782d86, 0xc5dc5270, 0x246a009f, + 0x46b78675, 0xa701d49a, 0xc30bfa7b, 0x22bda894, 0x40602e7e, + 0xa1d67c91}, + {0x00000000, 0x5880e2d7, 0xf106b474, 0xa98656a3, 0xe20d68e9, + 0xba8d8a3e, 0x130bdc9d, 0x4b8b3e4a, 0x851da109, 0xdd9d43de, + 0x741b157d, 0x2c9bf7aa, 0x6710c9e0, 0x3f902b37, 0x96167d94, + 0xce969f43, 0x0a3b4213, 0x52bba0c4, 0xfb3df667, 0xa3bd14b0, + 0xe8362afa, 0xb0b6c82d, 0x19309e8e, 0x41b07c59, 0x8f26e31a, + 0xd7a601cd, 0x7e20576e, 0x26a0b5b9, 0x6d2b8bf3, 0x35ab6924, + 0x9c2d3f87, 0xc4addd50, 0x14768426, 0x4cf666f1, 0xe5703052, + 0xbdf0d285, 0xf67beccf, 0xaefb0e18, 0x077d58bb, 0x5ffdba6c, + 0x916b252f, 0xc9ebc7f8, 0x606d915b, 0x38ed738c, 0x73664dc6, + 0x2be6af11, 0x8260f9b2, 0xdae01b65, 0x1e4dc635, 0x46cd24e2, + 0xef4b7241, 0xb7cb9096, 0xfc40aedc, 0xa4c04c0b, 0x0d461aa8, + 0x55c6f87f, 0x9b50673c, 0xc3d085eb, 0x6a56d348, 0x32d6319f, + 0x795d0fd5, 0x21dded02, 0x885bbba1, 0xd0db5976, 0x28ec084d, + 0x706cea9a, 0xd9eabc39, 0x816a5eee, 0xcae160a4, 0x92618273, + 0x3be7d4d0, 0x63673607, 0xadf1a944, 0xf5714b93, 0x5cf71d30, + 0x0477ffe7, 0x4ffcc1ad, 0x177c237a, 0xbefa75d9, 0xe67a970e, + 0x22d74a5e, 0x7a57a889, 0xd3d1fe2a, 0x8b511cfd, 0xc0da22b7, + 0x985ac060, 0x31dc96c3, 0x695c7414, 0xa7caeb57, 0xff4a0980, + 0x56cc5f23, 0x0e4cbdf4, 0x45c783be, 0x1d476169, 0xb4c137ca, + 0xec41d51d, 0x3c9a8c6b, 0x641a6ebc, 0xcd9c381f, 0x951cdac8, + 0xde97e482, 0x86170655, 0x2f9150f6, 0x7711b221, 0xb9872d62, + 0xe107cfb5, 0x48819916, 0x10017bc1, 0x5b8a458b, 0x030aa75c, + 0xaa8cf1ff, 0xf20c1328, 0x36a1ce78, 0x6e212caf, 0xc7a77a0c, + 0x9f2798db, 0xd4aca691, 0x8c2c4446, 0x25aa12e5, 0x7d2af032, + 0xb3bc6f71, 0xeb3c8da6, 0x42badb05, 0x1a3a39d2, 0x51b10798, + 0x0931e54f, 0xa0b7b3ec, 0xf837513b, 0x50d8119a, 0x0858f34d, + 0xa1dea5ee, 0xf95e4739, 0xb2d57973, 0xea559ba4, 0x43d3cd07, + 0x1b532fd0, 0xd5c5b093, 0x8d455244, 0x24c304e7, 0x7c43e630, + 0x37c8d87a, 0x6f483aad, 0xc6ce6c0e, 0x9e4e8ed9, 0x5ae35389, + 0x0263b15e, 0xabe5e7fd, 0xf365052a, 0xb8ee3b60, 0xe06ed9b7, + 0x49e88f14, 0x11686dc3, 0xdffef280, 0x877e1057, 0x2ef846f4, + 0x7678a423, 0x3df39a69, 0x657378be, 0xccf52e1d, 0x9475ccca, + 0x44ae95bc, 0x1c2e776b, 0xb5a821c8, 0xed28c31f, 0xa6a3fd55, + 0xfe231f82, 0x57a54921, 0x0f25abf6, 0xc1b334b5, 0x9933d662, + 0x30b580c1, 0x68356216, 0x23be5c5c, 0x7b3ebe8b, 0xd2b8e828, + 0x8a380aff, 0x4e95d7af, 0x16153578, 0xbf9363db, 0xe713810c, + 0xac98bf46, 0xf4185d91, 0x5d9e0b32, 0x051ee9e5, 0xcb8876a6, + 0x93089471, 0x3a8ec2d2, 0x620e2005, 0x29851e4f, 0x7105fc98, + 0xd883aa3b, 0x800348ec, 0x783419d7, 0x20b4fb00, 0x8932ada3, + 0xd1b24f74, 0x9a39713e, 0xc2b993e9, 0x6b3fc54a, 0x33bf279d, + 0xfd29b8de, 0xa5a95a09, 0x0c2f0caa, 0x54afee7d, 0x1f24d037, + 0x47a432e0, 0xee226443, 0xb6a28694, 0x720f5bc4, 0x2a8fb913, + 0x8309efb0, 0xdb890d67, 0x9002332d, 0xc882d1fa, 0x61048759, + 0x3984658e, 0xf712facd, 0xaf92181a, 0x06144eb9, 0x5e94ac6e, + 0x151f9224, 0x4d9f70f3, 0xe4192650, 0xbc99c487, 0x6c429df1, + 0x34c27f26, 0x9d442985, 0xc5c4cb52, 0x8e4ff518, 0xd6cf17cf, + 0x7f49416c, 0x27c9a3bb, 0xe95f3cf8, 0xb1dfde2f, 0x1859888c, + 0x40d96a5b, 0x0b525411, 0x53d2b6c6, 0xfa54e065, 0xa2d402b2, + 0x6679dfe2, 0x3ef93d35, 0x977f6b96, 0xcfff8941, 0x8474b70b, + 0xdcf455dc, 0x7572037f, 0x2df2e1a8, 0xe3647eeb, 0xbbe49c3c, + 0x1262ca9f, 0x4ae22848, 0x01691602, 0x59e9f4d5, 0xf06fa276, + 0xa8ef40a1}, + {0x00000000, 0x463b6765, 0x8c76ceca, 0xca4da9af, 0x59ebed4e, + 0x1fd08a2b, 0xd59d2384, 0x93a644e1, 0xb2d6db9d, 0xf4edbcf8, + 0x3ea01557, 0x789b7232, 0xeb3d36d3, 0xad0651b6, 0x674bf819, + 0x21709f7c, 0x25abc6e0, 0x6390a185, 0xa9dd082a, 0xefe66f4f, + 0x7c402bae, 0x3a7b4ccb, 0xf036e564, 0xb60d8201, 0x977d1d7d, + 0xd1467a18, 0x1b0bd3b7, 0x5d30b4d2, 0xce96f033, 0x88ad9756, + 0x42e03ef9, 0x04db599c, 0x0b50fc1a, 0x4d6b9b7f, 0x872632d0, + 0xc11d55b5, 0x52bb1154, 0x14807631, 0xdecddf9e, 0x98f6b8fb, + 0xb9862787, 0xffbd40e2, 0x35f0e94d, 0x73cb8e28, 0xe06dcac9, + 0xa656adac, 0x6c1b0403, 0x2a206366, 0x2efb3afa, 0x68c05d9f, + 0xa28df430, 0xe4b69355, 0x7710d7b4, 0x312bb0d1, 0xfb66197e, + 0xbd5d7e1b, 0x9c2de167, 0xda168602, 0x105b2fad, 0x566048c8, + 0xc5c60c29, 0x83fd6b4c, 0x49b0c2e3, 0x0f8ba586, 0x16a0f835, + 0x509b9f50, 0x9ad636ff, 0xdced519a, 0x4f4b157b, 0x0970721e, + 0xc33ddbb1, 0x8506bcd4, 0xa47623a8, 0xe24d44cd, 0x2800ed62, + 0x6e3b8a07, 0xfd9dcee6, 0xbba6a983, 0x71eb002c, 0x37d06749, + 0x330b3ed5, 0x753059b0, 0xbf7df01f, 0xf946977a, 0x6ae0d39b, + 0x2cdbb4fe, 0xe6961d51, 0xa0ad7a34, 0x81dde548, 0xc7e6822d, + 0x0dab2b82, 0x4b904ce7, 0xd8360806, 0x9e0d6f63, 0x5440c6cc, + 0x127ba1a9, 0x1df0042f, 0x5bcb634a, 0x9186cae5, 0xd7bdad80, + 0x441be961, 0x02208e04, 0xc86d27ab, 0x8e5640ce, 0xaf26dfb2, + 0xe91db8d7, 0x23501178, 0x656b761d, 0xf6cd32fc, 0xb0f65599, + 0x7abbfc36, 0x3c809b53, 0x385bc2cf, 0x7e60a5aa, 0xb42d0c05, + 0xf2166b60, 0x61b02f81, 0x278b48e4, 0xedc6e14b, 0xabfd862e, + 0x8a8d1952, 0xccb67e37, 0x06fbd798, 0x40c0b0fd, 0xd366f41c, + 0x955d9379, 0x5f103ad6, 0x192b5db3, 0x2c40f16b, 0x6a7b960e, + 0xa0363fa1, 0xe60d58c4, 0x75ab1c25, 0x33907b40, 0xf9ddd2ef, + 0xbfe6b58a, 0x9e962af6, 0xd8ad4d93, 0x12e0e43c, 0x54db8359, + 0xc77dc7b8, 0x8146a0dd, 0x4b0b0972, 0x0d306e17, 0x09eb378b, + 0x4fd050ee, 0x859df941, 0xc3a69e24, 0x5000dac5, 0x163bbda0, + 0xdc76140f, 0x9a4d736a, 0xbb3dec16, 0xfd068b73, 0x374b22dc, + 0x717045b9, 0xe2d60158, 0xa4ed663d, 0x6ea0cf92, 0x289ba8f7, + 0x27100d71, 0x612b6a14, 0xab66c3bb, 0xed5da4de, 0x7efbe03f, + 0x38c0875a, 0xf28d2ef5, 0xb4b64990, 0x95c6d6ec, 0xd3fdb189, + 0x19b01826, 0x5f8b7f43, 0xcc2d3ba2, 0x8a165cc7, 0x405bf568, + 0x0660920d, 0x02bbcb91, 0x4480acf4, 0x8ecd055b, 0xc8f6623e, + 0x5b5026df, 0x1d6b41ba, 0xd726e815, 0x911d8f70, 0xb06d100c, + 0xf6567769, 0x3c1bdec6, 0x7a20b9a3, 0xe986fd42, 0xafbd9a27, + 0x65f03388, 0x23cb54ed, 0x3ae0095e, 0x7cdb6e3b, 0xb696c794, + 0xf0ada0f1, 0x630be410, 0x25308375, 0xef7d2ada, 0xa9464dbf, + 0x8836d2c3, 0xce0db5a6, 0x04401c09, 0x427b7b6c, 0xd1dd3f8d, + 0x97e658e8, 0x5dabf147, 0x1b909622, 0x1f4bcfbe, 0x5970a8db, + 0x933d0174, 0xd5066611, 0x46a022f0, 0x009b4595, 0xcad6ec3a, + 0x8ced8b5f, 0xad9d1423, 0xeba67346, 0x21ebdae9, 0x67d0bd8c, + 0xf476f96d, 0xb24d9e08, 0x780037a7, 0x3e3b50c2, 0x31b0f544, + 0x778b9221, 0xbdc63b8e, 0xfbfd5ceb, 0x685b180a, 0x2e607f6f, + 0xe42dd6c0, 0xa216b1a5, 0x83662ed9, 0xc55d49bc, 0x0f10e013, + 0x492b8776, 0xda8dc397, 0x9cb6a4f2, 0x56fb0d5d, 0x10c06a38, + 0x141b33a4, 0x522054c1, 0x986dfd6e, 0xde569a0b, 0x4df0deea, + 0x0bcbb98f, 0xc1861020, 0x87bd7745, 0xa6cde839, 0xe0f68f5c, + 0x2abb26f3, 0x6c804196, 0xff260577, 0xb91d6212, 0x7350cbbd, + 0x356bacd8}}; + +#endif + +#endif + +#if N == 6 + +#if W == 8 + +local const z_crc_t FAR crc_braid_table[][256] = { + {0x00000000, 0x3db1ecdc, 0x7b63d9b8, 0x46d23564, 0xf6c7b370, + 0xcb765fac, 0x8da46ac8, 0xb0158614, 0x36fe60a1, 0x0b4f8c7d, + 0x4d9db919, 0x702c55c5, 0xc039d3d1, 0xfd883f0d, 0xbb5a0a69, + 0x86ebe6b5, 0x6dfcc142, 0x504d2d9e, 0x169f18fa, 0x2b2ef426, + 0x9b3b7232, 0xa68a9eee, 0xe058ab8a, 0xdde94756, 0x5b02a1e3, + 0x66b34d3f, 0x2061785b, 0x1dd09487, 0xadc51293, 0x9074fe4f, + 0xd6a6cb2b, 0xeb1727f7, 0xdbf98284, 0xe6486e58, 0xa09a5b3c, + 0x9d2bb7e0, 0x2d3e31f4, 0x108fdd28, 0x565de84c, 0x6bec0490, + 0xed07e225, 0xd0b60ef9, 0x96643b9d, 0xabd5d741, 0x1bc05155, + 0x2671bd89, 0x60a388ed, 0x5d126431, 0xb60543c6, 0x8bb4af1a, + 0xcd669a7e, 0xf0d776a2, 0x40c2f0b6, 0x7d731c6a, 0x3ba1290e, + 0x0610c5d2, 0x80fb2367, 0xbd4acfbb, 0xfb98fadf, 0xc6291603, + 0x763c9017, 0x4b8d7ccb, 0x0d5f49af, 0x30eea573, 0x6c820349, + 0x5133ef95, 0x17e1daf1, 0x2a50362d, 0x9a45b039, 0xa7f45ce5, + 0xe1266981, 0xdc97855d, 0x5a7c63e8, 0x67cd8f34, 0x211fba50, + 0x1cae568c, 0xacbbd098, 0x910a3c44, 0xd7d80920, 0xea69e5fc, + 0x017ec20b, 0x3ccf2ed7, 0x7a1d1bb3, 0x47acf76f, 0xf7b9717b, + 0xca089da7, 0x8cdaa8c3, 0xb16b441f, 0x3780a2aa, 0x0a314e76, + 0x4ce37b12, 0x715297ce, 0xc14711da, 0xfcf6fd06, 0xba24c862, + 0x879524be, 0xb77b81cd, 0x8aca6d11, 0xcc185875, 0xf1a9b4a9, + 0x41bc32bd, 0x7c0dde61, 0x3adfeb05, 0x076e07d9, 0x8185e16c, + 0xbc340db0, 0xfae638d4, 0xc757d408, 0x7742521c, 0x4af3bec0, + 0x0c218ba4, 0x31906778, 0xda87408f, 0xe736ac53, 0xa1e49937, + 0x9c5575eb, 0x2c40f3ff, 0x11f11f23, 0x57232a47, 0x6a92c69b, + 0xec79202e, 0xd1c8ccf2, 0x971af996, 0xaaab154a, 0x1abe935e, + 0x270f7f82, 0x61dd4ae6, 0x5c6ca63a, 0xd9040692, 0xe4b5ea4e, + 0xa267df2a, 0x9fd633f6, 0x2fc3b5e2, 0x1272593e, 0x54a06c5a, + 0x69118086, 0xeffa6633, 0xd24b8aef, 0x9499bf8b, 0xa9285357, + 0x193dd543, 0x248c399f, 0x625e0cfb, 0x5fefe027, 0xb4f8c7d0, + 0x89492b0c, 0xcf9b1e68, 0xf22af2b4, 0x423f74a0, 0x7f8e987c, + 0x395cad18, 0x04ed41c4, 0x8206a771, 0xbfb74bad, 0xf9657ec9, + 0xc4d49215, 0x74c11401, 0x4970f8dd, 0x0fa2cdb9, 0x32132165, + 0x02fd8416, 0x3f4c68ca, 0x799e5dae, 0x442fb172, 0xf43a3766, + 0xc98bdbba, 0x8f59eede, 0xb2e80202, 0x3403e4b7, 0x09b2086b, + 0x4f603d0f, 0x72d1d1d3, 0xc2c457c7, 0xff75bb1b, 0xb9a78e7f, + 0x841662a3, 0x6f014554, 0x52b0a988, 0x14629cec, 0x29d37030, + 0x99c6f624, 0xa4771af8, 0xe2a52f9c, 0xdf14c340, 0x59ff25f5, + 0x644ec929, 0x229cfc4d, 0x1f2d1091, 0xaf389685, 0x92897a59, + 0xd45b4f3d, 0xe9eaa3e1, 0xb58605db, 0x8837e907, 0xcee5dc63, + 0xf35430bf, 0x4341b6ab, 0x7ef05a77, 0x38226f13, 0x059383cf, + 0x8378657a, 0xbec989a6, 0xf81bbcc2, 0xc5aa501e, 0x75bfd60a, + 0x480e3ad6, 0x0edc0fb2, 0x336de36e, 0xd87ac499, 0xe5cb2845, + 0xa3191d21, 0x9ea8f1fd, 0x2ebd77e9, 0x130c9b35, 0x55deae51, + 0x686f428d, 0xee84a438, 0xd33548e4, 0x95e77d80, 0xa856915c, + 0x18431748, 0x25f2fb94, 0x6320cef0, 0x5e91222c, 0x6e7f875f, + 0x53ce6b83, 0x151c5ee7, 0x28adb23b, 0x98b8342f, 0xa509d8f3, + 0xe3dbed97, 0xde6a014b, 0x5881e7fe, 0x65300b22, 0x23e23e46, + 0x1e53d29a, 0xae46548e, 0x93f7b852, 0xd5258d36, 0xe89461ea, + 0x0383461d, 0x3e32aac1, 0x78e09fa5, 0x45517379, 0xf544f56d, + 0xc8f519b1, 0x8e272cd5, 0xb396c009, 0x357d26bc, 0x08ccca60, + 0x4e1eff04, 0x73af13d8, 0xc3ba95cc, 0xfe0b7910, 0xb8d94c74, + 0x8568a0a8}, + {0x00000000, 0x69790b65, 0xd2f216ca, 0xbb8b1daf, 0x7e952bd5, + 0x17ec20b0, 0xac673d1f, 0xc51e367a, 0xfd2a57aa, 0x94535ccf, + 0x2fd84160, 0x46a14a05, 0x83bf7c7f, 0xeac6771a, 0x514d6ab5, + 0x383461d0, 0x2125a915, 0x485ca270, 0xf3d7bfdf, 0x9aaeb4ba, + 0x5fb082c0, 0x36c989a5, 0x8d42940a, 0xe43b9f6f, 0xdc0ffebf, + 0xb576f5da, 0x0efde875, 0x6784e310, 0xa29ad56a, 0xcbe3de0f, + 0x7068c3a0, 0x1911c8c5, 0x424b522a, 0x2b32594f, 0x90b944e0, + 0xf9c04f85, 0x3cde79ff, 0x55a7729a, 0xee2c6f35, 0x87556450, + 0xbf610580, 0xd6180ee5, 0x6d93134a, 0x04ea182f, 0xc1f42e55, + 0xa88d2530, 0x1306389f, 0x7a7f33fa, 0x636efb3f, 0x0a17f05a, + 0xb19cedf5, 0xd8e5e690, 0x1dfbd0ea, 0x7482db8f, 0xcf09c620, + 0xa670cd45, 0x9e44ac95, 0xf73da7f0, 0x4cb6ba5f, 0x25cfb13a, + 0xe0d18740, 0x89a88c25, 0x3223918a, 0x5b5a9aef, 0x8496a454, + 0xedefaf31, 0x5664b29e, 0x3f1db9fb, 0xfa038f81, 0x937a84e4, + 0x28f1994b, 0x4188922e, 0x79bcf3fe, 0x10c5f89b, 0xab4ee534, + 0xc237ee51, 0x0729d82b, 0x6e50d34e, 0xd5dbcee1, 0xbca2c584, + 0xa5b30d41, 0xccca0624, 0x77411b8b, 0x1e3810ee, 0xdb262694, + 0xb25f2df1, 0x09d4305e, 0x60ad3b3b, 0x58995aeb, 0x31e0518e, + 0x8a6b4c21, 0xe3124744, 0x260c713e, 0x4f757a5b, 0xf4fe67f4, + 0x9d876c91, 0xc6ddf67e, 0xafa4fd1b, 0x142fe0b4, 0x7d56ebd1, + 0xb848ddab, 0xd131d6ce, 0x6abacb61, 0x03c3c004, 0x3bf7a1d4, + 0x528eaab1, 0xe905b71e, 0x807cbc7b, 0x45628a01, 0x2c1b8164, + 0x97909ccb, 0xfee997ae, 0xe7f85f6b, 0x8e81540e, 0x350a49a1, + 0x5c7342c4, 0x996d74be, 0xf0147fdb, 0x4b9f6274, 0x22e66911, + 0x1ad208c1, 0x73ab03a4, 0xc8201e0b, 0xa159156e, 0x64472314, + 0x0d3e2871, 0xb6b535de, 0xdfcc3ebb, 0xd25c4ee9, 0xbb25458c, + 0x00ae5823, 0x69d75346, 0xacc9653c, 0xc5b06e59, 0x7e3b73f6, + 0x17427893, 0x2f761943, 0x460f1226, 0xfd840f89, 0x94fd04ec, + 0x51e33296, 0x389a39f3, 0x8311245c, 0xea682f39, 0xf379e7fc, + 0x9a00ec99, 0x218bf136, 0x48f2fa53, 0x8deccc29, 0xe495c74c, + 0x5f1edae3, 0x3667d186, 0x0e53b056, 0x672abb33, 0xdca1a69c, + 0xb5d8adf9, 0x70c69b83, 0x19bf90e6, 0xa2348d49, 0xcb4d862c, + 0x90171cc3, 0xf96e17a6, 0x42e50a09, 0x2b9c016c, 0xee823716, + 0x87fb3c73, 0x3c7021dc, 0x55092ab9, 0x6d3d4b69, 0x0444400c, + 0xbfcf5da3, 0xd6b656c6, 0x13a860bc, 0x7ad16bd9, 0xc15a7676, + 0xa8237d13, 0xb132b5d6, 0xd84bbeb3, 0x63c0a31c, 0x0ab9a879, + 0xcfa79e03, 0xa6de9566, 0x1d5588c9, 0x742c83ac, 0x4c18e27c, + 0x2561e919, 0x9eeaf4b6, 0xf793ffd3, 0x328dc9a9, 0x5bf4c2cc, + 0xe07fdf63, 0x8906d406, 0x56caeabd, 0x3fb3e1d8, 0x8438fc77, + 0xed41f712, 0x285fc168, 0x4126ca0d, 0xfaadd7a2, 0x93d4dcc7, + 0xabe0bd17, 0xc299b672, 0x7912abdd, 0x106ba0b8, 0xd57596c2, + 0xbc0c9da7, 0x07878008, 0x6efe8b6d, 0x77ef43a8, 0x1e9648cd, + 0xa51d5562, 0xcc645e07, 0x097a687d, 0x60036318, 0xdb887eb7, + 0xb2f175d2, 0x8ac51402, 0xe3bc1f67, 0x583702c8, 0x314e09ad, + 0xf4503fd7, 0x9d2934b2, 0x26a2291d, 0x4fdb2278, 0x1481b897, + 0x7df8b3f2, 0xc673ae5d, 0xaf0aa538, 0x6a149342, 0x036d9827, + 0xb8e68588, 0xd19f8eed, 0xe9abef3d, 0x80d2e458, 0x3b59f9f7, + 0x5220f292, 0x973ec4e8, 0xfe47cf8d, 0x45ccd222, 0x2cb5d947, + 0x35a41182, 0x5cdd1ae7, 0xe7560748, 0x8e2f0c2d, 0x4b313a57, + 0x22483132, 0x99c32c9d, 0xf0ba27f8, 0xc88e4628, 0xa1f74d4d, + 0x1a7c50e2, 0x73055b87, 0xb61b6dfd, 0xdf626698, 0x64e97b37, + 0x0d907052}, + {0x00000000, 0x7fc99b93, 0xff933726, 0x805aacb5, 0x2457680d, + 0x5b9ef39e, 0xdbc45f2b, 0xa40dc4b8, 0x48aed01a, 0x37674b89, + 0xb73de73c, 0xc8f47caf, 0x6cf9b817, 0x13302384, 0x936a8f31, + 0xeca314a2, 0x915da034, 0xee943ba7, 0x6ece9712, 0x11070c81, + 0xb50ac839, 0xcac353aa, 0x4a99ff1f, 0x3550648c, 0xd9f3702e, + 0xa63aebbd, 0x26604708, 0x59a9dc9b, 0xfda41823, 0x826d83b0, + 0x02372f05, 0x7dfeb496, 0xf9ca4629, 0x8603ddba, 0x0659710f, + 0x7990ea9c, 0xdd9d2e24, 0xa254b5b7, 0x220e1902, 0x5dc78291, + 0xb1649633, 0xcead0da0, 0x4ef7a115, 0x313e3a86, 0x9533fe3e, + 0xeafa65ad, 0x6aa0c918, 0x1569528b, 0x6897e61d, 0x175e7d8e, + 0x9704d13b, 0xe8cd4aa8, 0x4cc08e10, 0x33091583, 0xb353b936, + 0xcc9a22a5, 0x20393607, 0x5ff0ad94, 0xdfaa0121, 0xa0639ab2, + 0x046e5e0a, 0x7ba7c599, 0xfbfd692c, 0x8434f2bf, 0x28e58a13, + 0x572c1180, 0xd776bd35, 0xa8bf26a6, 0x0cb2e21e, 0x737b798d, + 0xf321d538, 0x8ce84eab, 0x604b5a09, 0x1f82c19a, 0x9fd86d2f, + 0xe011f6bc, 0x441c3204, 0x3bd5a997, 0xbb8f0522, 0xc4469eb1, + 0xb9b82a27, 0xc671b1b4, 0x462b1d01, 0x39e28692, 0x9def422a, + 0xe226d9b9, 0x627c750c, 0x1db5ee9f, 0xf116fa3d, 0x8edf61ae, + 0x0e85cd1b, 0x714c5688, 0xd5419230, 0xaa8809a3, 0x2ad2a516, + 0x551b3e85, 0xd12fcc3a, 0xaee657a9, 0x2ebcfb1c, 0x5175608f, + 0xf578a437, 0x8ab13fa4, 0x0aeb9311, 0x75220882, 0x99811c20, + 0xe64887b3, 0x66122b06, 0x19dbb095, 0xbdd6742d, 0xc21fefbe, + 0x4245430b, 0x3d8cd898, 0x40726c0e, 0x3fbbf79d, 0xbfe15b28, + 0xc028c0bb, 0x64250403, 0x1bec9f90, 0x9bb63325, 0xe47fa8b6, + 0x08dcbc14, 0x77152787, 0xf74f8b32, 0x888610a1, 0x2c8bd419, + 0x53424f8a, 0xd318e33f, 0xacd178ac, 0x51cb1426, 0x2e028fb5, + 0xae582300, 0xd191b893, 0x759c7c2b, 0x0a55e7b8, 0x8a0f4b0d, + 0xf5c6d09e, 0x1965c43c, 0x66ac5faf, 0xe6f6f31a, 0x993f6889, + 0x3d32ac31, 0x42fb37a2, 0xc2a19b17, 0xbd680084, 0xc096b412, + 0xbf5f2f81, 0x3f058334, 0x40cc18a7, 0xe4c1dc1f, 0x9b08478c, + 0x1b52eb39, 0x649b70aa, 0x88386408, 0xf7f1ff9b, 0x77ab532e, + 0x0862c8bd, 0xac6f0c05, 0xd3a69796, 0x53fc3b23, 0x2c35a0b0, + 0xa801520f, 0xd7c8c99c, 0x57926529, 0x285bfeba, 0x8c563a02, + 0xf39fa191, 0x73c50d24, 0x0c0c96b7, 0xe0af8215, 0x9f661986, + 0x1f3cb533, 0x60f52ea0, 0xc4f8ea18, 0xbb31718b, 0x3b6bdd3e, + 0x44a246ad, 0x395cf23b, 0x469569a8, 0xc6cfc51d, 0xb9065e8e, + 0x1d0b9a36, 0x62c201a5, 0xe298ad10, 0x9d513683, 0x71f22221, + 0x0e3bb9b2, 0x8e611507, 0xf1a88e94, 0x55a54a2c, 0x2a6cd1bf, + 0xaa367d0a, 0xd5ffe699, 0x792e9e35, 0x06e705a6, 0x86bda913, + 0xf9743280, 0x5d79f638, 0x22b06dab, 0xa2eac11e, 0xdd235a8d, + 0x31804e2f, 0x4e49d5bc, 0xce137909, 0xb1dae29a, 0x15d72622, + 0x6a1ebdb1, 0xea441104, 0x958d8a97, 0xe8733e01, 0x97baa592, + 0x17e00927, 0x682992b4, 0xcc24560c, 0xb3edcd9f, 0x33b7612a, + 0x4c7efab9, 0xa0ddee1b, 0xdf147588, 0x5f4ed93d, 0x208742ae, + 0x848a8616, 0xfb431d85, 0x7b19b130, 0x04d02aa3, 0x80e4d81c, + 0xff2d438f, 0x7f77ef3a, 0x00be74a9, 0xa4b3b011, 0xdb7a2b82, + 0x5b208737, 0x24e91ca4, 0xc84a0806, 0xb7839395, 0x37d93f20, + 0x4810a4b3, 0xec1d600b, 0x93d4fb98, 0x138e572d, 0x6c47ccbe, + 0x11b97828, 0x6e70e3bb, 0xee2a4f0e, 0x91e3d49d, 0x35ee1025, + 0x4a278bb6, 0xca7d2703, 0xb5b4bc90, 0x5917a832, 0x26de33a1, + 0xa6849f14, 0xd94d0487, 0x7d40c03f, 0x02895bac, 0x82d3f719, + 0xfd1a6c8a}, + {0x00000000, 0xa396284c, 0x9c5d56d9, 0x3fcb7e95, 0xe3cbabf3, + 0x405d83bf, 0x7f96fd2a, 0xdc00d566, 0x1ce651a7, 0xbf7079eb, + 0x80bb077e, 0x232d2f32, 0xff2dfa54, 0x5cbbd218, 0x6370ac8d, + 0xc0e684c1, 0x39cca34e, 0x9a5a8b02, 0xa591f597, 0x0607dddb, + 0xda0708bd, 0x799120f1, 0x465a5e64, 0xe5cc7628, 0x252af2e9, + 0x86bcdaa5, 0xb977a430, 0x1ae18c7c, 0xc6e1591a, 0x65777156, + 0x5abc0fc3, 0xf92a278f, 0x7399469c, 0xd00f6ed0, 0xefc41045, + 0x4c523809, 0x9052ed6f, 0x33c4c523, 0x0c0fbbb6, 0xaf9993fa, + 0x6f7f173b, 0xcce93f77, 0xf32241e2, 0x50b469ae, 0x8cb4bcc8, + 0x2f229484, 0x10e9ea11, 0xb37fc25d, 0x4a55e5d2, 0xe9c3cd9e, + 0xd608b30b, 0x759e9b47, 0xa99e4e21, 0x0a08666d, 0x35c318f8, + 0x965530b4, 0x56b3b475, 0xf5259c39, 0xcaeee2ac, 0x6978cae0, + 0xb5781f86, 0x16ee37ca, 0x2925495f, 0x8ab36113, 0xe7328d38, + 0x44a4a574, 0x7b6fdbe1, 0xd8f9f3ad, 0x04f926cb, 0xa76f0e87, + 0x98a47012, 0x3b32585e, 0xfbd4dc9f, 0x5842f4d3, 0x67898a46, + 0xc41fa20a, 0x181f776c, 0xbb895f20, 0x844221b5, 0x27d409f9, + 0xdefe2e76, 0x7d68063a, 0x42a378af, 0xe13550e3, 0x3d358585, + 0x9ea3adc9, 0xa168d35c, 0x02fefb10, 0xc2187fd1, 0x618e579d, + 0x5e452908, 0xfdd30144, 0x21d3d422, 0x8245fc6e, 0xbd8e82fb, + 0x1e18aab7, 0x94abcba4, 0x373de3e8, 0x08f69d7d, 0xab60b531, + 0x77606057, 0xd4f6481b, 0xeb3d368e, 0x48ab1ec2, 0x884d9a03, + 0x2bdbb24f, 0x1410ccda, 0xb786e496, 0x6b8631f0, 0xc81019bc, + 0xf7db6729, 0x544d4f65, 0xad6768ea, 0x0ef140a6, 0x313a3e33, + 0x92ac167f, 0x4eacc319, 0xed3aeb55, 0xd2f195c0, 0x7167bd8c, + 0xb181394d, 0x12171101, 0x2ddc6f94, 0x8e4a47d8, 0x524a92be, + 0xf1dcbaf2, 0xce17c467, 0x6d81ec2b, 0x15141c31, 0xb682347d, + 0x89494ae8, 0x2adf62a4, 0xf6dfb7c2, 0x55499f8e, 0x6a82e11b, + 0xc914c957, 0x09f24d96, 0xaa6465da, 0x95af1b4f, 0x36393303, + 0xea39e665, 0x49afce29, 0x7664b0bc, 0xd5f298f0, 0x2cd8bf7f, + 0x8f4e9733, 0xb085e9a6, 0x1313c1ea, 0xcf13148c, 0x6c853cc0, + 0x534e4255, 0xf0d86a19, 0x303eeed8, 0x93a8c694, 0xac63b801, + 0x0ff5904d, 0xd3f5452b, 0x70636d67, 0x4fa813f2, 0xec3e3bbe, + 0x668d5aad, 0xc51b72e1, 0xfad00c74, 0x59462438, 0x8546f15e, + 0x26d0d912, 0x191ba787, 0xba8d8fcb, 0x7a6b0b0a, 0xd9fd2346, + 0xe6365dd3, 0x45a0759f, 0x99a0a0f9, 0x3a3688b5, 0x05fdf620, + 0xa66bde6c, 0x5f41f9e3, 0xfcd7d1af, 0xc31caf3a, 0x608a8776, + 0xbc8a5210, 0x1f1c7a5c, 0x20d704c9, 0x83412c85, 0x43a7a844, + 0xe0318008, 0xdffafe9d, 0x7c6cd6d1, 0xa06c03b7, 0x03fa2bfb, + 0x3c31556e, 0x9fa77d22, 0xf2269109, 0x51b0b945, 0x6e7bc7d0, + 0xcdedef9c, 0x11ed3afa, 0xb27b12b6, 0x8db06c23, 0x2e26446f, + 0xeec0c0ae, 0x4d56e8e2, 0x729d9677, 0xd10bbe3b, 0x0d0b6b5d, + 0xae9d4311, 0x91563d84, 0x32c015c8, 0xcbea3247, 0x687c1a0b, + 0x57b7649e, 0xf4214cd2, 0x282199b4, 0x8bb7b1f8, 0xb47ccf6d, + 0x17eae721, 0xd70c63e0, 0x749a4bac, 0x4b513539, 0xe8c71d75, + 0x34c7c813, 0x9751e05f, 0xa89a9eca, 0x0b0cb686, 0x81bfd795, + 0x2229ffd9, 0x1de2814c, 0xbe74a900, 0x62747c66, 0xc1e2542a, + 0xfe292abf, 0x5dbf02f3, 0x9d598632, 0x3ecfae7e, 0x0104d0eb, + 0xa292f8a7, 0x7e922dc1, 0xdd04058d, 0xe2cf7b18, 0x41595354, + 0xb87374db, 0x1be55c97, 0x242e2202, 0x87b80a4e, 0x5bb8df28, + 0xf82ef764, 0xc7e589f1, 0x6473a1bd, 0xa495257c, 0x07030d30, + 0x38c873a5, 0x9b5e5be9, 0x475e8e8f, 0xe4c8a6c3, 0xdb03d856, + 0x7895f01a}, + {0x00000000, 0x2a283862, 0x545070c4, 0x7e7848a6, 0xa8a0e188, + 0x8288d9ea, 0xfcf0914c, 0xd6d8a92e, 0x8a30c551, 0xa018fd33, + 0xde60b595, 0xf4488df7, 0x229024d9, 0x08b81cbb, 0x76c0541d, + 0x5ce86c7f, 0xcf108ce3, 0xe538b481, 0x9b40fc27, 0xb168c445, + 0x67b06d6b, 0x4d985509, 0x33e01daf, 0x19c825cd, 0x452049b2, + 0x6f0871d0, 0x11703976, 0x3b580114, 0xed80a83a, 0xc7a89058, + 0xb9d0d8fe, 0x93f8e09c, 0x45501f87, 0x6f7827e5, 0x11006f43, + 0x3b285721, 0xedf0fe0f, 0xc7d8c66d, 0xb9a08ecb, 0x9388b6a9, + 0xcf60dad6, 0xe548e2b4, 0x9b30aa12, 0xb1189270, 0x67c03b5e, + 0x4de8033c, 0x33904b9a, 0x19b873f8, 0x8a409364, 0xa068ab06, + 0xde10e3a0, 0xf438dbc2, 0x22e072ec, 0x08c84a8e, 0x76b00228, + 0x5c983a4a, 0x00705635, 0x2a586e57, 0x542026f1, 0x7e081e93, + 0xa8d0b7bd, 0x82f88fdf, 0xfc80c779, 0xd6a8ff1b, 0x8aa03f0e, + 0xa088076c, 0xdef04fca, 0xf4d877a8, 0x2200de86, 0x0828e6e4, + 0x7650ae42, 0x5c789620, 0x0090fa5f, 0x2ab8c23d, 0x54c08a9b, + 0x7ee8b2f9, 0xa8301bd7, 0x821823b5, 0xfc606b13, 0xd6485371, + 0x45b0b3ed, 0x6f988b8f, 0x11e0c329, 0x3bc8fb4b, 0xed105265, + 0xc7386a07, 0xb94022a1, 0x93681ac3, 0xcf8076bc, 0xe5a84ede, + 0x9bd00678, 0xb1f83e1a, 0x67209734, 0x4d08af56, 0x3370e7f0, + 0x1958df92, 0xcff02089, 0xe5d818eb, 0x9ba0504d, 0xb188682f, + 0x6750c101, 0x4d78f963, 0x3300b1c5, 0x192889a7, 0x45c0e5d8, + 0x6fe8ddba, 0x1190951c, 0x3bb8ad7e, 0xed600450, 0xc7483c32, + 0xb9307494, 0x93184cf6, 0x00e0ac6a, 0x2ac89408, 0x54b0dcae, + 0x7e98e4cc, 0xa8404de2, 0x82687580, 0xfc103d26, 0xd6380544, + 0x8ad0693b, 0xa0f85159, 0xde8019ff, 0xf4a8219d, 0x227088b3, + 0x0858b0d1, 0x7620f877, 0x5c08c015, 0xce31785d, 0xe419403f, + 0x9a610899, 0xb04930fb, 0x669199d5, 0x4cb9a1b7, 0x32c1e911, + 0x18e9d173, 0x4401bd0c, 0x6e29856e, 0x1051cdc8, 0x3a79f5aa, + 0xeca15c84, 0xc68964e6, 0xb8f12c40, 0x92d91422, 0x0121f4be, + 0x2b09ccdc, 0x5571847a, 0x7f59bc18, 0xa9811536, 0x83a92d54, + 0xfdd165f2, 0xd7f95d90, 0x8b1131ef, 0xa139098d, 0xdf41412b, + 0xf5697949, 0x23b1d067, 0x0999e805, 0x77e1a0a3, 0x5dc998c1, + 0x8b6167da, 0xa1495fb8, 0xdf31171e, 0xf5192f7c, 0x23c18652, + 0x09e9be30, 0x7791f696, 0x5db9cef4, 0x0151a28b, 0x2b799ae9, + 0x5501d24f, 0x7f29ea2d, 0xa9f14303, 0x83d97b61, 0xfda133c7, + 0xd7890ba5, 0x4471eb39, 0x6e59d35b, 0x10219bfd, 0x3a09a39f, + 0xecd10ab1, 0xc6f932d3, 0xb8817a75, 0x92a94217, 0xce412e68, + 0xe469160a, 0x9a115eac, 0xb03966ce, 0x66e1cfe0, 0x4cc9f782, + 0x32b1bf24, 0x18998746, 0x44914753, 0x6eb97f31, 0x10c13797, + 0x3ae90ff5, 0xec31a6db, 0xc6199eb9, 0xb861d61f, 0x9249ee7d, + 0xcea18202, 0xe489ba60, 0x9af1f2c6, 0xb0d9caa4, 0x6601638a, + 0x4c295be8, 0x3251134e, 0x18792b2c, 0x8b81cbb0, 0xa1a9f3d2, + 0xdfd1bb74, 0xf5f98316, 0x23212a38, 0x0909125a, 0x77715afc, + 0x5d59629e, 0x01b10ee1, 0x2b993683, 0x55e17e25, 0x7fc94647, + 0xa911ef69, 0x8339d70b, 0xfd419fad, 0xd769a7cf, 0x01c158d4, + 0x2be960b6, 0x55912810, 0x7fb91072, 0xa961b95c, 0x8349813e, + 0xfd31c998, 0xd719f1fa, 0x8bf19d85, 0xa1d9a5e7, 0xdfa1ed41, + 0xf589d523, 0x23517c0d, 0x0979446f, 0x77010cc9, 0x5d2934ab, + 0xced1d437, 0xe4f9ec55, 0x9a81a4f3, 0xb0a99c91, 0x667135bf, + 0x4c590ddd, 0x3221457b, 0x18097d19, 0x44e11166, 0x6ec92904, + 0x10b161a2, 0x3a9959c0, 0xec41f0ee, 0xc669c88c, 0xb811802a, + 0x9239b848}, + {0x00000000, 0x4713f6fb, 0x8e27edf6, 0xc9341b0d, 0xc73eddad, + 0x802d2b56, 0x4919305b, 0x0e0ac6a0, 0x550cbd1b, 0x121f4be0, + 0xdb2b50ed, 0x9c38a616, 0x923260b6, 0xd521964d, 0x1c158d40, + 0x5b067bbb, 0xaa197a36, 0xed0a8ccd, 0x243e97c0, 0x632d613b, + 0x6d27a79b, 0x2a345160, 0xe3004a6d, 0xa413bc96, 0xff15c72d, + 0xb80631d6, 0x71322adb, 0x3621dc20, 0x382b1a80, 0x7f38ec7b, + 0xb60cf776, 0xf11f018d, 0x8f43f22d, 0xc85004d6, 0x01641fdb, + 0x4677e920, 0x487d2f80, 0x0f6ed97b, 0xc65ac276, 0x8149348d, + 0xda4f4f36, 0x9d5cb9cd, 0x5468a2c0, 0x137b543b, 0x1d71929b, + 0x5a626460, 0x93567f6d, 0xd4458996, 0x255a881b, 0x62497ee0, + 0xab7d65ed, 0xec6e9316, 0xe26455b6, 0xa577a34d, 0x6c43b840, + 0x2b504ebb, 0x70563500, 0x3745c3fb, 0xfe71d8f6, 0xb9622e0d, + 0xb768e8ad, 0xf07b1e56, 0x394f055b, 0x7e5cf3a0, 0xc5f6e21b, + 0x82e514e0, 0x4bd10fed, 0x0cc2f916, 0x02c83fb6, 0x45dbc94d, + 0x8cefd240, 0xcbfc24bb, 0x90fa5f00, 0xd7e9a9fb, 0x1eddb2f6, + 0x59ce440d, 0x57c482ad, 0x10d77456, 0xd9e36f5b, 0x9ef099a0, + 0x6fef982d, 0x28fc6ed6, 0xe1c875db, 0xa6db8320, 0xa8d14580, + 0xefc2b37b, 0x26f6a876, 0x61e55e8d, 0x3ae32536, 0x7df0d3cd, + 0xb4c4c8c0, 0xf3d73e3b, 0xfdddf89b, 0xbace0e60, 0x73fa156d, + 0x34e9e396, 0x4ab51036, 0x0da6e6cd, 0xc492fdc0, 0x83810b3b, + 0x8d8bcd9b, 0xca983b60, 0x03ac206d, 0x44bfd696, 0x1fb9ad2d, + 0x58aa5bd6, 0x919e40db, 0xd68db620, 0xd8877080, 0x9f94867b, + 0x56a09d76, 0x11b36b8d, 0xe0ac6a00, 0xa7bf9cfb, 0x6e8b87f6, + 0x2998710d, 0x2792b7ad, 0x60814156, 0xa9b55a5b, 0xeea6aca0, + 0xb5a0d71b, 0xf2b321e0, 0x3b873aed, 0x7c94cc16, 0x729e0ab6, + 0x358dfc4d, 0xfcb9e740, 0xbbaa11bb, 0x509cc277, 0x178f348c, + 0xdebb2f81, 0x99a8d97a, 0x97a21fda, 0xd0b1e921, 0x1985f22c, + 0x5e9604d7, 0x05907f6c, 0x42838997, 0x8bb7929a, 0xcca46461, + 0xc2aea2c1, 0x85bd543a, 0x4c894f37, 0x0b9ab9cc, 0xfa85b841, + 0xbd964eba, 0x74a255b7, 0x33b1a34c, 0x3dbb65ec, 0x7aa89317, + 0xb39c881a, 0xf48f7ee1, 0xaf89055a, 0xe89af3a1, 0x21aee8ac, + 0x66bd1e57, 0x68b7d8f7, 0x2fa42e0c, 0xe6903501, 0xa183c3fa, + 0xdfdf305a, 0x98ccc6a1, 0x51f8ddac, 0x16eb2b57, 0x18e1edf7, + 0x5ff21b0c, 0x96c60001, 0xd1d5f6fa, 0x8ad38d41, 0xcdc07bba, + 0x04f460b7, 0x43e7964c, 0x4ded50ec, 0x0afea617, 0xc3cabd1a, + 0x84d94be1, 0x75c64a6c, 0x32d5bc97, 0xfbe1a79a, 0xbcf25161, + 0xb2f897c1, 0xf5eb613a, 0x3cdf7a37, 0x7bcc8ccc, 0x20caf777, + 0x67d9018c, 0xaeed1a81, 0xe9feec7a, 0xe7f42ada, 0xa0e7dc21, + 0x69d3c72c, 0x2ec031d7, 0x956a206c, 0xd279d697, 0x1b4dcd9a, + 0x5c5e3b61, 0x5254fdc1, 0x15470b3a, 0xdc731037, 0x9b60e6cc, + 0xc0669d77, 0x87756b8c, 0x4e417081, 0x0952867a, 0x075840da, + 0x404bb621, 0x897fad2c, 0xce6c5bd7, 0x3f735a5a, 0x7860aca1, + 0xb154b7ac, 0xf6474157, 0xf84d87f7, 0xbf5e710c, 0x766a6a01, + 0x31799cfa, 0x6a7fe741, 0x2d6c11ba, 0xe4580ab7, 0xa34bfc4c, + 0xad413aec, 0xea52cc17, 0x2366d71a, 0x647521e1, 0x1a29d241, + 0x5d3a24ba, 0x940e3fb7, 0xd31dc94c, 0xdd170fec, 0x9a04f917, + 0x5330e21a, 0x142314e1, 0x4f256f5a, 0x083699a1, 0xc10282ac, + 0x86117457, 0x881bb2f7, 0xcf08440c, 0x063c5f01, 0x412fa9fa, + 0xb030a877, 0xf7235e8c, 0x3e174581, 0x7904b37a, 0x770e75da, + 0x301d8321, 0xf929982c, 0xbe3a6ed7, 0xe53c156c, 0xa22fe397, + 0x6b1bf89a, 0x2c080e61, 0x2202c8c1, 0x65113e3a, 0xac252537, + 0xeb36d3cc}, + {0x00000000, 0xa13984ee, 0x99020f9d, 0x383b8b73, 0xe975197b, + 0x484c9d95, 0x707716e6, 0xd14e9208, 0x099b34b7, 0xa8a2b059, + 0x90993b2a, 0x31a0bfc4, 0xe0ee2dcc, 0x41d7a922, 0x79ec2251, + 0xd8d5a6bf, 0x1336696e, 0xb20fed80, 0x8a3466f3, 0x2b0de21d, + 0xfa437015, 0x5b7af4fb, 0x63417f88, 0xc278fb66, 0x1aad5dd9, + 0xbb94d937, 0x83af5244, 0x2296d6aa, 0xf3d844a2, 0x52e1c04c, + 0x6ada4b3f, 0xcbe3cfd1, 0x266cd2dc, 0x87555632, 0xbf6edd41, + 0x1e5759af, 0xcf19cba7, 0x6e204f49, 0x561bc43a, 0xf72240d4, + 0x2ff7e66b, 0x8ece6285, 0xb6f5e9f6, 0x17cc6d18, 0xc682ff10, + 0x67bb7bfe, 0x5f80f08d, 0xfeb97463, 0x355abbb2, 0x94633f5c, + 0xac58b42f, 0x0d6130c1, 0xdc2fa2c9, 0x7d162627, 0x452dad54, + 0xe41429ba, 0x3cc18f05, 0x9df80beb, 0xa5c38098, 0x04fa0476, + 0xd5b4967e, 0x748d1290, 0x4cb699e3, 0xed8f1d0d, 0x4cd9a5b8, + 0xede02156, 0xd5dbaa25, 0x74e22ecb, 0xa5acbcc3, 0x0495382d, + 0x3caeb35e, 0x9d9737b0, 0x4542910f, 0xe47b15e1, 0xdc409e92, + 0x7d791a7c, 0xac378874, 0x0d0e0c9a, 0x353587e9, 0x940c0307, + 0x5fefccd6, 0xfed64838, 0xc6edc34b, 0x67d447a5, 0xb69ad5ad, + 0x17a35143, 0x2f98da30, 0x8ea15ede, 0x5674f861, 0xf74d7c8f, + 0xcf76f7fc, 0x6e4f7312, 0xbf01e11a, 0x1e3865f4, 0x2603ee87, + 0x873a6a69, 0x6ab57764, 0xcb8cf38a, 0xf3b778f9, 0x528efc17, + 0x83c06e1f, 0x22f9eaf1, 0x1ac26182, 0xbbfbe56c, 0x632e43d3, + 0xc217c73d, 0xfa2c4c4e, 0x5b15c8a0, 0x8a5b5aa8, 0x2b62de46, + 0x13595535, 0xb260d1db, 0x79831e0a, 0xd8ba9ae4, 0xe0811197, + 0x41b89579, 0x90f60771, 0x31cf839f, 0x09f408ec, 0xa8cd8c02, + 0x70182abd, 0xd121ae53, 0xe91a2520, 0x4823a1ce, 0x996d33c6, + 0x3854b728, 0x006f3c5b, 0xa156b8b5, 0x99b34b70, 0x388acf9e, + 0x00b144ed, 0xa188c003, 0x70c6520b, 0xd1ffd6e5, 0xe9c45d96, + 0x48fdd978, 0x90287fc7, 0x3111fb29, 0x092a705a, 0xa813f4b4, + 0x795d66bc, 0xd864e252, 0xe05f6921, 0x4166edcf, 0x8a85221e, + 0x2bbca6f0, 0x13872d83, 0xb2bea96d, 0x63f03b65, 0xc2c9bf8b, + 0xfaf234f8, 0x5bcbb016, 0x831e16a9, 0x22279247, 0x1a1c1934, + 0xbb259dda, 0x6a6b0fd2, 0xcb528b3c, 0xf369004f, 0x525084a1, + 0xbfdf99ac, 0x1ee61d42, 0x26dd9631, 0x87e412df, 0x56aa80d7, + 0xf7930439, 0xcfa88f4a, 0x6e910ba4, 0xb644ad1b, 0x177d29f5, + 0x2f46a286, 0x8e7f2668, 0x5f31b460, 0xfe08308e, 0xc633bbfd, + 0x670a3f13, 0xace9f0c2, 0x0dd0742c, 0x35ebff5f, 0x94d27bb1, + 0x459ce9b9, 0xe4a56d57, 0xdc9ee624, 0x7da762ca, 0xa572c475, + 0x044b409b, 0x3c70cbe8, 0x9d494f06, 0x4c07dd0e, 0xed3e59e0, + 0xd505d293, 0x743c567d, 0xd56aeec8, 0x74536a26, 0x4c68e155, + 0xed5165bb, 0x3c1ff7b3, 0x9d26735d, 0xa51df82e, 0x04247cc0, + 0xdcf1da7f, 0x7dc85e91, 0x45f3d5e2, 0xe4ca510c, 0x3584c304, + 0x94bd47ea, 0xac86cc99, 0x0dbf4877, 0xc65c87a6, 0x67650348, + 0x5f5e883b, 0xfe670cd5, 0x2f299edd, 0x8e101a33, 0xb62b9140, + 0x171215ae, 0xcfc7b311, 0x6efe37ff, 0x56c5bc8c, 0xf7fc3862, + 0x26b2aa6a, 0x878b2e84, 0xbfb0a5f7, 0x1e892119, 0xf3063c14, + 0x523fb8fa, 0x6a043389, 0xcb3db767, 0x1a73256f, 0xbb4aa181, + 0x83712af2, 0x2248ae1c, 0xfa9d08a3, 0x5ba48c4d, 0x639f073e, + 0xc2a683d0, 0x13e811d8, 0xb2d19536, 0x8aea1e45, 0x2bd39aab, + 0xe030557a, 0x4109d194, 0x79325ae7, 0xd80bde09, 0x09454c01, + 0xa87cc8ef, 0x9047439c, 0x317ec772, 0xe9ab61cd, 0x4892e523, + 0x70a96e50, 0xd190eabe, 0x00de78b6, 0xa1e7fc58, 0x99dc772b, + 0x38e5f3c5}, + {0x00000000, 0xe81790a1, 0x0b5e2703, 0xe349b7a2, 0x16bc4e06, + 0xfeabdea7, 0x1de26905, 0xf5f5f9a4, 0x2d789c0c, 0xc56f0cad, + 0x2626bb0f, 0xce312bae, 0x3bc4d20a, 0xd3d342ab, 0x309af509, + 0xd88d65a8, 0x5af13818, 0xb2e6a8b9, 0x51af1f1b, 0xb9b88fba, + 0x4c4d761e, 0xa45ae6bf, 0x4713511d, 0xaf04c1bc, 0x7789a414, + 0x9f9e34b5, 0x7cd78317, 0x94c013b6, 0x6135ea12, 0x89227ab3, + 0x6a6bcd11, 0x827c5db0, 0xb5e27030, 0x5df5e091, 0xbebc5733, + 0x56abc792, 0xa35e3e36, 0x4b49ae97, 0xa8001935, 0x40178994, + 0x989aec3c, 0x708d7c9d, 0x93c4cb3f, 0x7bd35b9e, 0x8e26a23a, + 0x6631329b, 0x85788539, 0x6d6f1598, 0xef134828, 0x0704d889, + 0xe44d6f2b, 0x0c5aff8a, 0xf9af062e, 0x11b8968f, 0xf2f1212d, + 0x1ae6b18c, 0xc26bd424, 0x2a7c4485, 0xc935f327, 0x21226386, + 0xd4d79a22, 0x3cc00a83, 0xdf89bd21, 0x379e2d80, 0xb0b5e621, + 0x58a27680, 0xbbebc122, 0x53fc5183, 0xa609a827, 0x4e1e3886, + 0xad578f24, 0x45401f85, 0x9dcd7a2d, 0x75daea8c, 0x96935d2e, + 0x7e84cd8f, 0x8b71342b, 0x6366a48a, 0x802f1328, 0x68388389, + 0xea44de39, 0x02534e98, 0xe11af93a, 0x090d699b, 0xfcf8903f, + 0x14ef009e, 0xf7a6b73c, 0x1fb1279d, 0xc73c4235, 0x2f2bd294, + 0xcc626536, 0x2475f597, 0xd1800c33, 0x39979c92, 0xdade2b30, + 0x32c9bb91, 0x05579611, 0xed4006b0, 0x0e09b112, 0xe61e21b3, + 0x13ebd817, 0xfbfc48b6, 0x18b5ff14, 0xf0a26fb5, 0x282f0a1d, + 0xc0389abc, 0x23712d1e, 0xcb66bdbf, 0x3e93441b, 0xd684d4ba, + 0x35cd6318, 0xdddaf3b9, 0x5fa6ae09, 0xb7b13ea8, 0x54f8890a, + 0xbcef19ab, 0x491ae00f, 0xa10d70ae, 0x4244c70c, 0xaa5357ad, + 0x72de3205, 0x9ac9a2a4, 0x79801506, 0x919785a7, 0x64627c03, + 0x8c75eca2, 0x6f3c5b00, 0x872bcba1, 0xba1aca03, 0x520d5aa2, + 0xb144ed00, 0x59537da1, 0xaca68405, 0x44b114a4, 0xa7f8a306, + 0x4fef33a7, 0x9762560f, 0x7f75c6ae, 0x9c3c710c, 0x742be1ad, + 0x81de1809, 0x69c988a8, 0x8a803f0a, 0x6297afab, 0xe0ebf21b, + 0x08fc62ba, 0xebb5d518, 0x03a245b9, 0xf657bc1d, 0x1e402cbc, + 0xfd099b1e, 0x151e0bbf, 0xcd936e17, 0x2584feb6, 0xc6cd4914, + 0x2edad9b5, 0xdb2f2011, 0x3338b0b0, 0xd0710712, 0x386697b3, + 0x0ff8ba33, 0xe7ef2a92, 0x04a69d30, 0xecb10d91, 0x1944f435, + 0xf1536494, 0x121ad336, 0xfa0d4397, 0x2280263f, 0xca97b69e, + 0x29de013c, 0xc1c9919d, 0x343c6839, 0xdc2bf898, 0x3f624f3a, + 0xd775df9b, 0x5509822b, 0xbd1e128a, 0x5e57a528, 0xb6403589, + 0x43b5cc2d, 0xaba25c8c, 0x48ebeb2e, 0xa0fc7b8f, 0x78711e27, + 0x90668e86, 0x732f3924, 0x9b38a985, 0x6ecd5021, 0x86dac080, + 0x65937722, 0x8d84e783, 0x0aaf2c22, 0xe2b8bc83, 0x01f10b21, + 0xe9e69b80, 0x1c136224, 0xf404f285, 0x174d4527, 0xff5ad586, + 0x27d7b02e, 0xcfc0208f, 0x2c89972d, 0xc49e078c, 0x316bfe28, + 0xd97c6e89, 0x3a35d92b, 0xd222498a, 0x505e143a, 0xb849849b, + 0x5b003339, 0xb317a398, 0x46e25a3c, 0xaef5ca9d, 0x4dbc7d3f, + 0xa5abed9e, 0x7d268836, 0x95311897, 0x7678af35, 0x9e6f3f94, + 0x6b9ac630, 0x838d5691, 0x60c4e133, 0x88d37192, 0xbf4d5c12, + 0x575accb3, 0xb4137b11, 0x5c04ebb0, 0xa9f11214, 0x41e682b5, + 0xa2af3517, 0x4ab8a5b6, 0x9235c01e, 0x7a2250bf, 0x996be71d, + 0x717c77bc, 0x84898e18, 0x6c9e1eb9, 0x8fd7a91b, 0x67c039ba, + 0xe5bc640a, 0x0dabf4ab, 0xeee24309, 0x06f5d3a8, 0xf3002a0c, + 0x1b17baad, 0xf85e0d0f, 0x10499dae, 0xc8c4f806, 0x20d368a7, + 0xc39adf05, 0x2b8d4fa4, 0xde78b600, 0x366f26a1, 0xd5269103, + 0x3d3101a2}}; + +local const z_word_t FAR crc_braid_big_table[][256] = { + {0x0000000000000000, 0xa19017e800000000, 0x03275e0b00000000, + 0xa2b749e300000000, 0x064ebc1600000000, 0xa7deabfe00000000, + 0x0569e21d00000000, 0xa4f9f5f500000000, 0x0c9c782d00000000, + 0xad0c6fc500000000, 0x0fbb262600000000, 0xae2b31ce00000000, + 0x0ad2c43b00000000, 0xab42d3d300000000, 0x09f59a3000000000, + 0xa8658dd800000000, 0x1838f15a00000000, 0xb9a8e6b200000000, + 0x1b1faf5100000000, 0xba8fb8b900000000, 0x1e764d4c00000000, + 0xbfe65aa400000000, 0x1d51134700000000, 0xbcc104af00000000, + 0x14a4897700000000, 0xb5349e9f00000000, 0x1783d77c00000000, + 0xb613c09400000000, 0x12ea356100000000, 0xb37a228900000000, + 0x11cd6b6a00000000, 0xb05d7c8200000000, 0x3070e2b500000000, + 0x91e0f55d00000000, 0x3357bcbe00000000, 0x92c7ab5600000000, + 0x363e5ea300000000, 0x97ae494b00000000, 0x351900a800000000, + 0x9489174000000000, 0x3cec9a9800000000, 0x9d7c8d7000000000, + 0x3fcbc49300000000, 0x9e5bd37b00000000, 0x3aa2268e00000000, + 0x9b32316600000000, 0x3985788500000000, 0x98156f6d00000000, + 0x284813ef00000000, 0x89d8040700000000, 0x2b6f4de400000000, + 0x8aff5a0c00000000, 0x2e06aff900000000, 0x8f96b81100000000, + 0x2d21f1f200000000, 0x8cb1e61a00000000, 0x24d46bc200000000, + 0x85447c2a00000000, 0x27f335c900000000, 0x8663222100000000, + 0x229ad7d400000000, 0x830ac03c00000000, 0x21bd89df00000000, + 0x802d9e3700000000, 0x21e6b5b000000000, 0x8076a25800000000, + 0x22c1ebbb00000000, 0x8351fc5300000000, 0x27a809a600000000, + 0x86381e4e00000000, 0x248f57ad00000000, 0x851f404500000000, + 0x2d7acd9d00000000, 0x8ceada7500000000, 0x2e5d939600000000, + 0x8fcd847e00000000, 0x2b34718b00000000, 0x8aa4666300000000, + 0x28132f8000000000, 0x8983386800000000, 0x39de44ea00000000, + 0x984e530200000000, 0x3af91ae100000000, 0x9b690d0900000000, + 0x3f90f8fc00000000, 0x9e00ef1400000000, 0x3cb7a6f700000000, + 0x9d27b11f00000000, 0x35423cc700000000, 0x94d22b2f00000000, + 0x366562cc00000000, 0x97f5752400000000, 0x330c80d100000000, + 0x929c973900000000, 0x302bdeda00000000, 0x91bbc93200000000, + 0x1196570500000000, 0xb00640ed00000000, 0x12b1090e00000000, + 0xb3211ee600000000, 0x17d8eb1300000000, 0xb648fcfb00000000, + 0x14ffb51800000000, 0xb56fa2f000000000, 0x1d0a2f2800000000, + 0xbc9a38c000000000, 0x1e2d712300000000, 0xbfbd66cb00000000, + 0x1b44933e00000000, 0xbad484d600000000, 0x1863cd3500000000, + 0xb9f3dadd00000000, 0x09aea65f00000000, 0xa83eb1b700000000, + 0x0a89f85400000000, 0xab19efbc00000000, 0x0fe01a4900000000, + 0xae700da100000000, 0x0cc7444200000000, 0xad5753aa00000000, + 0x0532de7200000000, 0xa4a2c99a00000000, 0x0615807900000000, + 0xa785979100000000, 0x037c626400000000, 0xa2ec758c00000000, + 0x005b3c6f00000000, 0xa1cb2b8700000000, 0x03ca1aba00000000, + 0xa25a0d5200000000, 0x00ed44b100000000, 0xa17d535900000000, + 0x0584a6ac00000000, 0xa414b14400000000, 0x06a3f8a700000000, + 0xa733ef4f00000000, 0x0f56629700000000, 0xaec6757f00000000, + 0x0c713c9c00000000, 0xade12b7400000000, 0x0918de8100000000, + 0xa888c96900000000, 0x0a3f808a00000000, 0xabaf976200000000, + 0x1bf2ebe000000000, 0xba62fc0800000000, 0x18d5b5eb00000000, + 0xb945a20300000000, 0x1dbc57f600000000, 0xbc2c401e00000000, + 0x1e9b09fd00000000, 0xbf0b1e1500000000, 0x176e93cd00000000, + 0xb6fe842500000000, 0x1449cdc600000000, 0xb5d9da2e00000000, + 0x11202fdb00000000, 0xb0b0383300000000, 0x120771d000000000, + 0xb397663800000000, 0x33baf80f00000000, 0x922aefe700000000, + 0x309da60400000000, 0x910db1ec00000000, 0x35f4441900000000, + 0x946453f100000000, 0x36d31a1200000000, 0x97430dfa00000000, + 0x3f26802200000000, 0x9eb697ca00000000, 0x3c01de2900000000, + 0x9d91c9c100000000, 0x39683c3400000000, 0x98f82bdc00000000, + 0x3a4f623f00000000, 0x9bdf75d700000000, 0x2b82095500000000, + 0x8a121ebd00000000, 0x28a5575e00000000, 0x893540b600000000, + 0x2dccb54300000000, 0x8c5ca2ab00000000, 0x2eebeb4800000000, + 0x8f7bfca000000000, 0x271e717800000000, 0x868e669000000000, + 0x24392f7300000000, 0x85a9389b00000000, 0x2150cd6e00000000, + 0x80c0da8600000000, 0x2277936500000000, 0x83e7848d00000000, + 0x222caf0a00000000, 0x83bcb8e200000000, 0x210bf10100000000, + 0x809be6e900000000, 0x2462131c00000000, 0x85f204f400000000, + 0x27454d1700000000, 0x86d55aff00000000, 0x2eb0d72700000000, + 0x8f20c0cf00000000, 0x2d97892c00000000, 0x8c079ec400000000, + 0x28fe6b3100000000, 0x896e7cd900000000, 0x2bd9353a00000000, + 0x8a4922d200000000, 0x3a145e5000000000, 0x9b8449b800000000, + 0x3933005b00000000, 0x98a317b300000000, 0x3c5ae24600000000, + 0x9dcaf5ae00000000, 0x3f7dbc4d00000000, 0x9eedaba500000000, + 0x3688267d00000000, 0x9718319500000000, 0x35af787600000000, + 0x943f6f9e00000000, 0x30c69a6b00000000, 0x91568d8300000000, + 0x33e1c46000000000, 0x9271d38800000000, 0x125c4dbf00000000, + 0xb3cc5a5700000000, 0x117b13b400000000, 0xb0eb045c00000000, + 0x1412f1a900000000, 0xb582e64100000000, 0x1735afa200000000, + 0xb6a5b84a00000000, 0x1ec0359200000000, 0xbf50227a00000000, + 0x1de76b9900000000, 0xbc777c7100000000, 0x188e898400000000, + 0xb91e9e6c00000000, 0x1ba9d78f00000000, 0xba39c06700000000, + 0x0a64bce500000000, 0xabf4ab0d00000000, 0x0943e2ee00000000, + 0xa8d3f50600000000, 0x0c2a00f300000000, 0xadba171b00000000, + 0x0f0d5ef800000000, 0xae9d491000000000, 0x06f8c4c800000000, + 0xa768d32000000000, 0x05df9ac300000000, 0xa44f8d2b00000000, + 0x00b678de00000000, 0xa1266f3600000000, 0x039126d500000000, + 0xa201313d00000000}, + {0x0000000000000000, 0xee8439a100000000, 0x9d0f029900000000, + 0x738b3b3800000000, 0x7b1975e900000000, 0x959d4c4800000000, + 0xe616777000000000, 0x08924ed100000000, 0xb7349b0900000000, + 0x59b0a2a800000000, 0x2a3b999000000000, 0xc4bfa03100000000, + 0xcc2deee000000000, 0x22a9d74100000000, 0x5122ec7900000000, + 0xbfa6d5d800000000, 0x6e69361300000000, 0x80ed0fb200000000, + 0xf366348a00000000, 0x1de20d2b00000000, 0x157043fa00000000, + 0xfbf47a5b00000000, 0x887f416300000000, 0x66fb78c200000000, + 0xd95dad1a00000000, 0x37d994bb00000000, 0x4452af8300000000, + 0xaad6962200000000, 0xa244d8f300000000, 0x4cc0e15200000000, + 0x3f4bda6a00000000, 0xd1cfe3cb00000000, 0xdcd26c2600000000, + 0x3256558700000000, 0x41dd6ebf00000000, 0xaf59571e00000000, + 0xa7cb19cf00000000, 0x494f206e00000000, 0x3ac41b5600000000, + 0xd44022f700000000, 0x6be6f72f00000000, 0x8562ce8e00000000, + 0xf6e9f5b600000000, 0x186dcc1700000000, 0x10ff82c600000000, + 0xfe7bbb6700000000, 0x8df0805f00000000, 0x6374b9fe00000000, + 0xb2bb5a3500000000, 0x5c3f639400000000, 0x2fb458ac00000000, + 0xc130610d00000000, 0xc9a22fdc00000000, 0x2726167d00000000, + 0x54ad2d4500000000, 0xba2914e400000000, 0x058fc13c00000000, + 0xeb0bf89d00000000, 0x9880c3a500000000, 0x7604fa0400000000, + 0x7e96b4d500000000, 0x90128d7400000000, 0xe399b64c00000000, + 0x0d1d8fed00000000, 0xb8a5d94c00000000, 0x5621e0ed00000000, + 0x25aadbd500000000, 0xcb2ee27400000000, 0xc3bcaca500000000, + 0x2d38950400000000, 0x5eb3ae3c00000000, 0xb037979d00000000, + 0x0f91424500000000, 0xe1157be400000000, 0x929e40dc00000000, + 0x7c1a797d00000000, 0x748837ac00000000, 0x9a0c0e0d00000000, + 0xe987353500000000, 0x07030c9400000000, 0xd6ccef5f00000000, + 0x3848d6fe00000000, 0x4bc3edc600000000, 0xa547d46700000000, + 0xadd59ab600000000, 0x4351a31700000000, 0x30da982f00000000, + 0xde5ea18e00000000, 0x61f8745600000000, 0x8f7c4df700000000, + 0xfcf776cf00000000, 0x12734f6e00000000, 0x1ae101bf00000000, + 0xf465381e00000000, 0x87ee032600000000, 0x696a3a8700000000, + 0x6477b56a00000000, 0x8af38ccb00000000, 0xf978b7f300000000, + 0x17fc8e5200000000, 0x1f6ec08300000000, 0xf1eaf92200000000, + 0x8261c21a00000000, 0x6ce5fbbb00000000, 0xd3432e6300000000, + 0x3dc717c200000000, 0x4e4c2cfa00000000, 0xa0c8155b00000000, + 0xa85a5b8a00000000, 0x46de622b00000000, 0x3555591300000000, + 0xdbd160b200000000, 0x0a1e837900000000, 0xe49abad800000000, + 0x971181e000000000, 0x7995b84100000000, 0x7107f69000000000, + 0x9f83cf3100000000, 0xec08f40900000000, 0x028ccda800000000, + 0xbd2a187000000000, 0x53ae21d100000000, 0x20251ae900000000, + 0xcea1234800000000, 0xc6336d9900000000, 0x28b7543800000000, + 0x5b3c6f0000000000, 0xb5b856a100000000, 0x704bb39900000000, + 0x9ecf8a3800000000, 0xed44b10000000000, 0x03c088a100000000, + 0x0b52c67000000000, 0xe5d6ffd100000000, 0x965dc4e900000000, + 0x78d9fd4800000000, 0xc77f289000000000, 0x29fb113100000000, + 0x5a702a0900000000, 0xb4f413a800000000, 0xbc665d7900000000, + 0x52e264d800000000, 0x21695fe000000000, 0xcfed664100000000, + 0x1e22858a00000000, 0xf0a6bc2b00000000, 0x832d871300000000, + 0x6da9beb200000000, 0x653bf06300000000, 0x8bbfc9c200000000, + 0xf834f2fa00000000, 0x16b0cb5b00000000, 0xa9161e8300000000, + 0x4792272200000000, 0x34191c1a00000000, 0xda9d25bb00000000, + 0xd20f6b6a00000000, 0x3c8b52cb00000000, 0x4f0069f300000000, + 0xa184505200000000, 0xac99dfbf00000000, 0x421de61e00000000, + 0x3196dd2600000000, 0xdf12e48700000000, 0xd780aa5600000000, + 0x390493f700000000, 0x4a8fa8cf00000000, 0xa40b916e00000000, + 0x1bad44b600000000, 0xf5297d1700000000, 0x86a2462f00000000, + 0x68267f8e00000000, 0x60b4315f00000000, 0x8e3008fe00000000, + 0xfdbb33c600000000, 0x133f0a6700000000, 0xc2f0e9ac00000000, + 0x2c74d00d00000000, 0x5fffeb3500000000, 0xb17bd29400000000, + 0xb9e99c4500000000, 0x576da5e400000000, 0x24e69edc00000000, + 0xca62a77d00000000, 0x75c472a500000000, 0x9b404b0400000000, + 0xe8cb703c00000000, 0x064f499d00000000, 0x0edd074c00000000, + 0xe0593eed00000000, 0x93d205d500000000, 0x7d563c7400000000, + 0xc8ee6ad500000000, 0x266a537400000000, 0x55e1684c00000000, + 0xbb6551ed00000000, 0xb3f71f3c00000000, 0x5d73269d00000000, + 0x2ef81da500000000, 0xc07c240400000000, 0x7fdaf1dc00000000, + 0x915ec87d00000000, 0xe2d5f34500000000, 0x0c51cae400000000, + 0x04c3843500000000, 0xea47bd9400000000, 0x99cc86ac00000000, + 0x7748bf0d00000000, 0xa6875cc600000000, 0x4803656700000000, + 0x3b885e5f00000000, 0xd50c67fe00000000, 0xdd9e292f00000000, + 0x331a108e00000000, 0x40912bb600000000, 0xae15121700000000, + 0x11b3c7cf00000000, 0xff37fe6e00000000, 0x8cbcc55600000000, + 0x6238fcf700000000, 0x6aaab22600000000, 0x842e8b8700000000, + 0xf7a5b0bf00000000, 0x1921891e00000000, 0x143c06f300000000, + 0xfab83f5200000000, 0x8933046a00000000, 0x67b73dcb00000000, + 0x6f25731a00000000, 0x81a14abb00000000, 0xf22a718300000000, + 0x1cae482200000000, 0xa3089dfa00000000, 0x4d8ca45b00000000, + 0x3e079f6300000000, 0xd083a6c200000000, 0xd811e81300000000, + 0x3695d1b200000000, 0x451eea8a00000000, 0xab9ad32b00000000, + 0x7a5530e000000000, 0x94d1094100000000, 0xe75a327900000000, + 0x09de0bd800000000, 0x014c450900000000, 0xefc87ca800000000, + 0x9c43479000000000, 0x72c77e3100000000, 0xcd61abe900000000, + 0x23e5924800000000, 0x506ea97000000000, 0xbeea90d100000000, + 0xb678de0000000000, 0x58fce7a100000000, 0x2b77dc9900000000, + 0xc5f3e53800000000}, + {0x0000000000000000, 0xfbf6134700000000, 0xf6ed278e00000000, + 0x0d1b34c900000000, 0xaddd3ec700000000, 0x562b2d8000000000, + 0x5b30194900000000, 0xa0c60a0e00000000, 0x1bbd0c5500000000, + 0xe04b1f1200000000, 0xed502bdb00000000, 0x16a6389c00000000, + 0xb660329200000000, 0x4d9621d500000000, 0x408d151c00000000, + 0xbb7b065b00000000, 0x367a19aa00000000, 0xcd8c0aed00000000, + 0xc0973e2400000000, 0x3b612d6300000000, 0x9ba7276d00000000, + 0x6051342a00000000, 0x6d4a00e300000000, 0x96bc13a400000000, + 0x2dc715ff00000000, 0xd63106b800000000, 0xdb2a327100000000, + 0x20dc213600000000, 0x801a2b3800000000, 0x7bec387f00000000, + 0x76f70cb600000000, 0x8d011ff100000000, 0x2df2438f00000000, + 0xd60450c800000000, 0xdb1f640100000000, 0x20e9774600000000, + 0x802f7d4800000000, 0x7bd96e0f00000000, 0x76c25ac600000000, + 0x8d34498100000000, 0x364f4fda00000000, 0xcdb95c9d00000000, + 0xc0a2685400000000, 0x3b547b1300000000, 0x9b92711d00000000, + 0x6064625a00000000, 0x6d7f569300000000, 0x968945d400000000, + 0x1b885a2500000000, 0xe07e496200000000, 0xed657dab00000000, + 0x16936eec00000000, 0xb65564e200000000, 0x4da377a500000000, + 0x40b8436c00000000, 0xbb4e502b00000000, 0x0035567000000000, + 0xfbc3453700000000, 0xf6d871fe00000000, 0x0d2e62b900000000, + 0xade868b700000000, 0x561e7bf000000000, 0x5b054f3900000000, + 0xa0f35c7e00000000, 0x1be2f6c500000000, 0xe014e58200000000, + 0xed0fd14b00000000, 0x16f9c20c00000000, 0xb63fc80200000000, + 0x4dc9db4500000000, 0x40d2ef8c00000000, 0xbb24fccb00000000, + 0x005ffa9000000000, 0xfba9e9d700000000, 0xf6b2dd1e00000000, + 0x0d44ce5900000000, 0xad82c45700000000, 0x5674d71000000000, + 0x5b6fe3d900000000, 0xa099f09e00000000, 0x2d98ef6f00000000, + 0xd66efc2800000000, 0xdb75c8e100000000, 0x2083dba600000000, + 0x8045d1a800000000, 0x7bb3c2ef00000000, 0x76a8f62600000000, + 0x8d5ee56100000000, 0x3625e33a00000000, 0xcdd3f07d00000000, + 0xc0c8c4b400000000, 0x3b3ed7f300000000, 0x9bf8ddfd00000000, + 0x600eceba00000000, 0x6d15fa7300000000, 0x96e3e93400000000, + 0x3610b54a00000000, 0xcde6a60d00000000, 0xc0fd92c400000000, + 0x3b0b818300000000, 0x9bcd8b8d00000000, 0x603b98ca00000000, + 0x6d20ac0300000000, 0x96d6bf4400000000, 0x2dadb91f00000000, + 0xd65baa5800000000, 0xdb409e9100000000, 0x20b68dd600000000, + 0x807087d800000000, 0x7b86949f00000000, 0x769da05600000000, + 0x8d6bb31100000000, 0x006aace000000000, 0xfb9cbfa700000000, + 0xf6878b6e00000000, 0x0d71982900000000, 0xadb7922700000000, + 0x5641816000000000, 0x5b5ab5a900000000, 0xa0aca6ee00000000, + 0x1bd7a0b500000000, 0xe021b3f200000000, 0xed3a873b00000000, + 0x16cc947c00000000, 0xb60a9e7200000000, 0x4dfc8d3500000000, + 0x40e7b9fc00000000, 0xbb11aabb00000000, 0x77c29c5000000000, + 0x8c348f1700000000, 0x812fbbde00000000, 0x7ad9a89900000000, + 0xda1fa29700000000, 0x21e9b1d000000000, 0x2cf2851900000000, + 0xd704965e00000000, 0x6c7f900500000000, 0x9789834200000000, + 0x9a92b78b00000000, 0x6164a4cc00000000, 0xc1a2aec200000000, + 0x3a54bd8500000000, 0x374f894c00000000, 0xccb99a0b00000000, + 0x41b885fa00000000, 0xba4e96bd00000000, 0xb755a27400000000, + 0x4ca3b13300000000, 0xec65bb3d00000000, 0x1793a87a00000000, + 0x1a889cb300000000, 0xe17e8ff400000000, 0x5a0589af00000000, + 0xa1f39ae800000000, 0xace8ae2100000000, 0x571ebd6600000000, + 0xf7d8b76800000000, 0x0c2ea42f00000000, 0x013590e600000000, + 0xfac383a100000000, 0x5a30dfdf00000000, 0xa1c6cc9800000000, + 0xacddf85100000000, 0x572beb1600000000, 0xf7ede11800000000, + 0x0c1bf25f00000000, 0x0100c69600000000, 0xfaf6d5d100000000, + 0x418dd38a00000000, 0xba7bc0cd00000000, 0xb760f40400000000, + 0x4c96e74300000000, 0xec50ed4d00000000, 0x17a6fe0a00000000, + 0x1abdcac300000000, 0xe14bd98400000000, 0x6c4ac67500000000, + 0x97bcd53200000000, 0x9aa7e1fb00000000, 0x6151f2bc00000000, + 0xc197f8b200000000, 0x3a61ebf500000000, 0x377adf3c00000000, + 0xcc8ccc7b00000000, 0x77f7ca2000000000, 0x8c01d96700000000, + 0x811aedae00000000, 0x7aecfee900000000, 0xda2af4e700000000, + 0x21dce7a000000000, 0x2cc7d36900000000, 0xd731c02e00000000, + 0x6c206a9500000000, 0x97d679d200000000, 0x9acd4d1b00000000, + 0x613b5e5c00000000, 0xc1fd545200000000, 0x3a0b471500000000, + 0x371073dc00000000, 0xcce6609b00000000, 0x779d66c000000000, + 0x8c6b758700000000, 0x8170414e00000000, 0x7a86520900000000, + 0xda40580700000000, 0x21b64b4000000000, 0x2cad7f8900000000, + 0xd75b6cce00000000, 0x5a5a733f00000000, 0xa1ac607800000000, + 0xacb754b100000000, 0x574147f600000000, 0xf7874df800000000, + 0x0c715ebf00000000, 0x016a6a7600000000, 0xfa9c793100000000, + 0x41e77f6a00000000, 0xba116c2d00000000, 0xb70a58e400000000, + 0x4cfc4ba300000000, 0xec3a41ad00000000, 0x17cc52ea00000000, + 0x1ad7662300000000, 0xe121756400000000, 0x41d2291a00000000, + 0xba243a5d00000000, 0xb73f0e9400000000, 0x4cc91dd300000000, + 0xec0f17dd00000000, 0x17f9049a00000000, 0x1ae2305300000000, + 0xe114231400000000, 0x5a6f254f00000000, 0xa199360800000000, + 0xac8202c100000000, 0x5774118600000000, 0xf7b21b8800000000, + 0x0c4408cf00000000, 0x015f3c0600000000, 0xfaa92f4100000000, + 0x77a830b000000000, 0x8c5e23f700000000, 0x8145173e00000000, + 0x7ab3047900000000, 0xda750e7700000000, 0x21831d3000000000, + 0x2c9829f900000000, 0xd76e3abe00000000, 0x6c153ce500000000, + 0x97e32fa200000000, 0x9af81b6b00000000, 0x610e082c00000000, + 0xc1c8022200000000, 0x3a3e116500000000, 0x372525ac00000000, + 0xccd336eb00000000}, + {0x0000000000000000, 0x6238282a00000000, 0xc470505400000000, + 0xa648787e00000000, 0x88e1a0a800000000, 0xead9888200000000, + 0x4c91f0fc00000000, 0x2ea9d8d600000000, 0x51c5308a00000000, + 0x33fd18a000000000, 0x95b560de00000000, 0xf78d48f400000000, + 0xd924902200000000, 0xbb1cb80800000000, 0x1d54c07600000000, + 0x7f6ce85c00000000, 0xe38c10cf00000000, 0x81b438e500000000, + 0x27fc409b00000000, 0x45c468b100000000, 0x6b6db06700000000, + 0x0955984d00000000, 0xaf1de03300000000, 0xcd25c81900000000, + 0xb249204500000000, 0xd071086f00000000, 0x7639701100000000, + 0x1401583b00000000, 0x3aa880ed00000000, 0x5890a8c700000000, + 0xfed8d0b900000000, 0x9ce0f89300000000, 0x871f504500000000, + 0xe527786f00000000, 0x436f001100000000, 0x2157283b00000000, + 0x0ffef0ed00000000, 0x6dc6d8c700000000, 0xcb8ea0b900000000, + 0xa9b6889300000000, 0xd6da60cf00000000, 0xb4e248e500000000, + 0x12aa309b00000000, 0x709218b100000000, 0x5e3bc06700000000, + 0x3c03e84d00000000, 0x9a4b903300000000, 0xf873b81900000000, + 0x6493408a00000000, 0x06ab68a000000000, 0xa0e310de00000000, + 0xc2db38f400000000, 0xec72e02200000000, 0x8e4ac80800000000, + 0x2802b07600000000, 0x4a3a985c00000000, 0x3556700000000000, + 0x576e582a00000000, 0xf126205400000000, 0x931e087e00000000, + 0xbdb7d0a800000000, 0xdf8ff88200000000, 0x79c780fc00000000, + 0x1bffa8d600000000, 0x0e3fa08a00000000, 0x6c0788a000000000, + 0xca4ff0de00000000, 0xa877d8f400000000, 0x86de002200000000, + 0xe4e6280800000000, 0x42ae507600000000, 0x2096785c00000000, + 0x5ffa900000000000, 0x3dc2b82a00000000, 0x9b8ac05400000000, + 0xf9b2e87e00000000, 0xd71b30a800000000, 0xb523188200000000, + 0x136b60fc00000000, 0x715348d600000000, 0xedb3b04500000000, + 0x8f8b986f00000000, 0x29c3e01100000000, 0x4bfbc83b00000000, + 0x655210ed00000000, 0x076a38c700000000, 0xa12240b900000000, + 0xc31a689300000000, 0xbc7680cf00000000, 0xde4ea8e500000000, + 0x7806d09b00000000, 0x1a3ef8b100000000, 0x3497206700000000, + 0x56af084d00000000, 0xf0e7703300000000, 0x92df581900000000, + 0x8920f0cf00000000, 0xeb18d8e500000000, 0x4d50a09b00000000, + 0x2f6888b100000000, 0x01c1506700000000, 0x63f9784d00000000, + 0xc5b1003300000000, 0xa789281900000000, 0xd8e5c04500000000, + 0xbadde86f00000000, 0x1c95901100000000, 0x7eadb83b00000000, + 0x500460ed00000000, 0x323c48c700000000, 0x947430b900000000, + 0xf64c189300000000, 0x6aace00000000000, 0x0894c82a00000000, + 0xaedcb05400000000, 0xcce4987e00000000, 0xe24d40a800000000, + 0x8075688200000000, 0x263d10fc00000000, 0x440538d600000000, + 0x3b69d08a00000000, 0x5951f8a000000000, 0xff1980de00000000, + 0x9d21a8f400000000, 0xb388702200000000, 0xd1b0580800000000, + 0x77f8207600000000, 0x15c0085c00000000, 0x5d7831ce00000000, + 0x3f4019e400000000, 0x9908619a00000000, 0xfb3049b000000000, + 0xd599916600000000, 0xb7a1b94c00000000, 0x11e9c13200000000, + 0x73d1e91800000000, 0x0cbd014400000000, 0x6e85296e00000000, + 0xc8cd511000000000, 0xaaf5793a00000000, 0x845ca1ec00000000, + 0xe66489c600000000, 0x402cf1b800000000, 0x2214d99200000000, + 0xbef4210100000000, 0xdccc092b00000000, 0x7a84715500000000, + 0x18bc597f00000000, 0x361581a900000000, 0x542da98300000000, + 0xf265d1fd00000000, 0x905df9d700000000, 0xef31118b00000000, + 0x8d0939a100000000, 0x2b4141df00000000, 0x497969f500000000, + 0x67d0b12300000000, 0x05e8990900000000, 0xa3a0e17700000000, + 0xc198c95d00000000, 0xda67618b00000000, 0xb85f49a100000000, + 0x1e1731df00000000, 0x7c2f19f500000000, 0x5286c12300000000, + 0x30bee90900000000, 0x96f6917700000000, 0xf4ceb95d00000000, + 0x8ba2510100000000, 0xe99a792b00000000, 0x4fd2015500000000, + 0x2dea297f00000000, 0x0343f1a900000000, 0x617bd98300000000, + 0xc733a1fd00000000, 0xa50b89d700000000, 0x39eb714400000000, + 0x5bd3596e00000000, 0xfd9b211000000000, 0x9fa3093a00000000, + 0xb10ad1ec00000000, 0xd332f9c600000000, 0x757a81b800000000, + 0x1742a99200000000, 0x682e41ce00000000, 0x0a1669e400000000, + 0xac5e119a00000000, 0xce6639b000000000, 0xe0cfe16600000000, + 0x82f7c94c00000000, 0x24bfb13200000000, 0x4687991800000000, + 0x5347914400000000, 0x317fb96e00000000, 0x9737c11000000000, + 0xf50fe93a00000000, 0xdba631ec00000000, 0xb99e19c600000000, + 0x1fd661b800000000, 0x7dee499200000000, 0x0282a1ce00000000, + 0x60ba89e400000000, 0xc6f2f19a00000000, 0xa4cad9b000000000, + 0x8a63016600000000, 0xe85b294c00000000, 0x4e13513200000000, + 0x2c2b791800000000, 0xb0cb818b00000000, 0xd2f3a9a100000000, + 0x74bbd1df00000000, 0x1683f9f500000000, 0x382a212300000000, + 0x5a12090900000000, 0xfc5a717700000000, 0x9e62595d00000000, + 0xe10eb10100000000, 0x8336992b00000000, 0x257ee15500000000, + 0x4746c97f00000000, 0x69ef11a900000000, 0x0bd7398300000000, + 0xad9f41fd00000000, 0xcfa769d700000000, 0xd458c10100000000, + 0xb660e92b00000000, 0x1028915500000000, 0x7210b97f00000000, + 0x5cb961a900000000, 0x3e81498300000000, 0x98c931fd00000000, + 0xfaf119d700000000, 0x859df18b00000000, 0xe7a5d9a100000000, + 0x41eda1df00000000, 0x23d589f500000000, 0x0d7c512300000000, + 0x6f44790900000000, 0xc90c017700000000, 0xab34295d00000000, + 0x37d4d1ce00000000, 0x55ecf9e400000000, 0xf3a4819a00000000, + 0x919ca9b000000000, 0xbf35716600000000, 0xdd0d594c00000000, + 0x7b45213200000000, 0x197d091800000000, 0x6611e14400000000, + 0x0429c96e00000000, 0xa261b11000000000, 0xc059993a00000000, + 0xeef041ec00000000, 0x8cc869c600000000, 0x2a8011b800000000, + 0x48b8399200000000}, + {0x0000000000000000, 0x4c2896a300000000, 0xd9565d9c00000000, + 0x957ecb3f00000000, 0xf3abcbe300000000, 0xbf835d4000000000, + 0x2afd967f00000000, 0x66d500dc00000000, 0xa751e61c00000000, + 0xeb7970bf00000000, 0x7e07bb8000000000, 0x322f2d2300000000, + 0x54fa2dff00000000, 0x18d2bb5c00000000, 0x8dac706300000000, + 0xc184e6c000000000, 0x4ea3cc3900000000, 0x028b5a9a00000000, + 0x97f591a500000000, 0xdbdd070600000000, 0xbd0807da00000000, + 0xf120917900000000, 0x645e5a4600000000, 0x2876cce500000000, + 0xe9f22a2500000000, 0xa5dabc8600000000, 0x30a477b900000000, + 0x7c8ce11a00000000, 0x1a59e1c600000000, 0x5671776500000000, + 0xc30fbc5a00000000, 0x8f272af900000000, 0x9c46997300000000, + 0xd06e0fd000000000, 0x4510c4ef00000000, 0x0938524c00000000, + 0x6fed529000000000, 0x23c5c43300000000, 0xb6bb0f0c00000000, + 0xfa9399af00000000, 0x3b177f6f00000000, 0x773fe9cc00000000, + 0xe24122f300000000, 0xae69b45000000000, 0xc8bcb48c00000000, + 0x8494222f00000000, 0x11eae91000000000, 0x5dc27fb300000000, + 0xd2e5554a00000000, 0x9ecdc3e900000000, 0x0bb308d600000000, + 0x479b9e7500000000, 0x214e9ea900000000, 0x6d66080a00000000, + 0xf818c33500000000, 0xb430559600000000, 0x75b4b35600000000, + 0x399c25f500000000, 0xace2eeca00000000, 0xe0ca786900000000, + 0x861f78b500000000, 0xca37ee1600000000, 0x5f49252900000000, + 0x1361b38a00000000, 0x388d32e700000000, 0x74a5a44400000000, + 0xe1db6f7b00000000, 0xadf3f9d800000000, 0xcb26f90400000000, + 0x870e6fa700000000, 0x1270a49800000000, 0x5e58323b00000000, + 0x9fdcd4fb00000000, 0xd3f4425800000000, 0x468a896700000000, + 0x0aa21fc400000000, 0x6c771f1800000000, 0x205f89bb00000000, + 0xb521428400000000, 0xf909d42700000000, 0x762efede00000000, + 0x3a06687d00000000, 0xaf78a34200000000, 0xe35035e100000000, + 0x8585353d00000000, 0xc9ada39e00000000, 0x5cd368a100000000, + 0x10fbfe0200000000, 0xd17f18c200000000, 0x9d578e6100000000, + 0x0829455e00000000, 0x4401d3fd00000000, 0x22d4d32100000000, + 0x6efc458200000000, 0xfb828ebd00000000, 0xb7aa181e00000000, + 0xa4cbab9400000000, 0xe8e33d3700000000, 0x7d9df60800000000, + 0x31b560ab00000000, 0x5760607700000000, 0x1b48f6d400000000, + 0x8e363deb00000000, 0xc21eab4800000000, 0x039a4d8800000000, + 0x4fb2db2b00000000, 0xdacc101400000000, 0x96e486b700000000, + 0xf031866b00000000, 0xbc1910c800000000, 0x2967dbf700000000, + 0x654f4d5400000000, 0xea6867ad00000000, 0xa640f10e00000000, + 0x333e3a3100000000, 0x7f16ac9200000000, 0x19c3ac4e00000000, + 0x55eb3aed00000000, 0xc095f1d200000000, 0x8cbd677100000000, + 0x4d3981b100000000, 0x0111171200000000, 0x946fdc2d00000000, + 0xd8474a8e00000000, 0xbe924a5200000000, 0xf2badcf100000000, + 0x67c417ce00000000, 0x2bec816d00000000, 0x311c141500000000, + 0x7d3482b600000000, 0xe84a498900000000, 0xa462df2a00000000, + 0xc2b7dff600000000, 0x8e9f495500000000, 0x1be1826a00000000, + 0x57c914c900000000, 0x964df20900000000, 0xda6564aa00000000, + 0x4f1baf9500000000, 0x0333393600000000, 0x65e639ea00000000, + 0x29ceaf4900000000, 0xbcb0647600000000, 0xf098f2d500000000, + 0x7fbfd82c00000000, 0x33974e8f00000000, 0xa6e985b000000000, + 0xeac1131300000000, 0x8c1413cf00000000, 0xc03c856c00000000, + 0x55424e5300000000, 0x196ad8f000000000, 0xd8ee3e3000000000, + 0x94c6a89300000000, 0x01b863ac00000000, 0x4d90f50f00000000, + 0x2b45f5d300000000, 0x676d637000000000, 0xf213a84f00000000, + 0xbe3b3eec00000000, 0xad5a8d6600000000, 0xe1721bc500000000, + 0x740cd0fa00000000, 0x3824465900000000, 0x5ef1468500000000, + 0x12d9d02600000000, 0x87a71b1900000000, 0xcb8f8dba00000000, + 0x0a0b6b7a00000000, 0x4623fdd900000000, 0xd35d36e600000000, + 0x9f75a04500000000, 0xf9a0a09900000000, 0xb588363a00000000, + 0x20f6fd0500000000, 0x6cde6ba600000000, 0xe3f9415f00000000, + 0xafd1d7fc00000000, 0x3aaf1cc300000000, 0x76878a6000000000, + 0x10528abc00000000, 0x5c7a1c1f00000000, 0xc904d72000000000, + 0x852c418300000000, 0x44a8a74300000000, 0x088031e000000000, + 0x9dfefadf00000000, 0xd1d66c7c00000000, 0xb7036ca000000000, + 0xfb2bfa0300000000, 0x6e55313c00000000, 0x227da79f00000000, + 0x099126f200000000, 0x45b9b05100000000, 0xd0c77b6e00000000, + 0x9cefedcd00000000, 0xfa3aed1100000000, 0xb6127bb200000000, + 0x236cb08d00000000, 0x6f44262e00000000, 0xaec0c0ee00000000, + 0xe2e8564d00000000, 0x77969d7200000000, 0x3bbe0bd100000000, + 0x5d6b0b0d00000000, 0x11439dae00000000, 0x843d569100000000, + 0xc815c03200000000, 0x4732eacb00000000, 0x0b1a7c6800000000, + 0x9e64b75700000000, 0xd24c21f400000000, 0xb499212800000000, + 0xf8b1b78b00000000, 0x6dcf7cb400000000, 0x21e7ea1700000000, + 0xe0630cd700000000, 0xac4b9a7400000000, 0x3935514b00000000, + 0x751dc7e800000000, 0x13c8c73400000000, 0x5fe0519700000000, + 0xca9e9aa800000000, 0x86b60c0b00000000, 0x95d7bf8100000000, + 0xd9ff292200000000, 0x4c81e21d00000000, 0x00a974be00000000, + 0x667c746200000000, 0x2a54e2c100000000, 0xbf2a29fe00000000, + 0xf302bf5d00000000, 0x3286599d00000000, 0x7eaecf3e00000000, + 0xebd0040100000000, 0xa7f892a200000000, 0xc12d927e00000000, + 0x8d0504dd00000000, 0x187bcfe200000000, 0x5453594100000000, + 0xdb7473b800000000, 0x975ce51b00000000, 0x02222e2400000000, + 0x4e0ab88700000000, 0x28dfb85b00000000, 0x64f72ef800000000, + 0xf189e5c700000000, 0xbda1736400000000, 0x7c2595a400000000, + 0x300d030700000000, 0xa573c83800000000, 0xe95b5e9b00000000, + 0x8f8e5e4700000000, 0xc3a6c8e400000000, 0x56d803db00000000, + 0x1af0957800000000}, + {0x0000000000000000, 0x939bc97f00000000, 0x263793ff00000000, + 0xb5ac5a8000000000, 0x0d68572400000000, 0x9ef39e5b00000000, + 0x2b5fc4db00000000, 0xb8c40da400000000, 0x1ad0ae4800000000, + 0x894b673700000000, 0x3ce73db700000000, 0xaf7cf4c800000000, + 0x17b8f96c00000000, 0x8423301300000000, 0x318f6a9300000000, + 0xa214a3ec00000000, 0x34a05d9100000000, 0xa73b94ee00000000, + 0x1297ce6e00000000, 0x810c071100000000, 0x39c80ab500000000, + 0xaa53c3ca00000000, 0x1fff994a00000000, 0x8c64503500000000, + 0x2e70f3d900000000, 0xbdeb3aa600000000, 0x0847602600000000, + 0x9bdca95900000000, 0x2318a4fd00000000, 0xb0836d8200000000, + 0x052f370200000000, 0x96b4fe7d00000000, 0x2946caf900000000, + 0xbadd038600000000, 0x0f71590600000000, 0x9cea907900000000, + 0x242e9ddd00000000, 0xb7b554a200000000, 0x02190e2200000000, + 0x9182c75d00000000, 0x339664b100000000, 0xa00dadce00000000, + 0x15a1f74e00000000, 0x863a3e3100000000, 0x3efe339500000000, + 0xad65faea00000000, 0x18c9a06a00000000, 0x8b52691500000000, + 0x1de6976800000000, 0x8e7d5e1700000000, 0x3bd1049700000000, + 0xa84acde800000000, 0x108ec04c00000000, 0x8315093300000000, + 0x36b953b300000000, 0xa5229acc00000000, 0x0736392000000000, + 0x94adf05f00000000, 0x2101aadf00000000, 0xb29a63a000000000, + 0x0a5e6e0400000000, 0x99c5a77b00000000, 0x2c69fdfb00000000, + 0xbff2348400000000, 0x138ae52800000000, 0x80112c5700000000, + 0x35bd76d700000000, 0xa626bfa800000000, 0x1ee2b20c00000000, + 0x8d797b7300000000, 0x38d521f300000000, 0xab4ee88c00000000, + 0x095a4b6000000000, 0x9ac1821f00000000, 0x2f6dd89f00000000, + 0xbcf611e000000000, 0x04321c4400000000, 0x97a9d53b00000000, + 0x22058fbb00000000, 0xb19e46c400000000, 0x272ab8b900000000, + 0xb4b171c600000000, 0x011d2b4600000000, 0x9286e23900000000, + 0x2a42ef9d00000000, 0xb9d926e200000000, 0x0c757c6200000000, + 0x9feeb51d00000000, 0x3dfa16f100000000, 0xae61df8e00000000, + 0x1bcd850e00000000, 0x88564c7100000000, 0x309241d500000000, + 0xa30988aa00000000, 0x16a5d22a00000000, 0x853e1b5500000000, + 0x3acc2fd100000000, 0xa957e6ae00000000, 0x1cfbbc2e00000000, + 0x8f60755100000000, 0x37a478f500000000, 0xa43fb18a00000000, + 0x1193eb0a00000000, 0x8208227500000000, 0x201c819900000000, + 0xb38748e600000000, 0x062b126600000000, 0x95b0db1900000000, + 0x2d74d6bd00000000, 0xbeef1fc200000000, 0x0b43454200000000, + 0x98d88c3d00000000, 0x0e6c724000000000, 0x9df7bb3f00000000, + 0x285be1bf00000000, 0xbbc028c000000000, 0x0304256400000000, + 0x909fec1b00000000, 0x2533b69b00000000, 0xb6a87fe400000000, + 0x14bcdc0800000000, 0x8727157700000000, 0x328b4ff700000000, + 0xa110868800000000, 0x19d48b2c00000000, 0x8a4f425300000000, + 0x3fe318d300000000, 0xac78d1ac00000000, 0x2614cb5100000000, + 0xb58f022e00000000, 0x002358ae00000000, 0x93b891d100000000, + 0x2b7c9c7500000000, 0xb8e7550a00000000, 0x0d4b0f8a00000000, + 0x9ed0c6f500000000, 0x3cc4651900000000, 0xaf5fac6600000000, + 0x1af3f6e600000000, 0x89683f9900000000, 0x31ac323d00000000, + 0xa237fb4200000000, 0x179ba1c200000000, 0x840068bd00000000, + 0x12b496c000000000, 0x812f5fbf00000000, 0x3483053f00000000, + 0xa718cc4000000000, 0x1fdcc1e400000000, 0x8c47089b00000000, + 0x39eb521b00000000, 0xaa709b6400000000, 0x0864388800000000, + 0x9bfff1f700000000, 0x2e53ab7700000000, 0xbdc8620800000000, + 0x050c6fac00000000, 0x9697a6d300000000, 0x233bfc5300000000, + 0xb0a0352c00000000, 0x0f5201a800000000, 0x9cc9c8d700000000, + 0x2965925700000000, 0xbafe5b2800000000, 0x023a568c00000000, + 0x91a19ff300000000, 0x240dc57300000000, 0xb7960c0c00000000, + 0x1582afe000000000, 0x8619669f00000000, 0x33b53c1f00000000, + 0xa02ef56000000000, 0x18eaf8c400000000, 0x8b7131bb00000000, + 0x3edd6b3b00000000, 0xad46a24400000000, 0x3bf25c3900000000, + 0xa869954600000000, 0x1dc5cfc600000000, 0x8e5e06b900000000, + 0x369a0b1d00000000, 0xa501c26200000000, 0x10ad98e200000000, + 0x8336519d00000000, 0x2122f27100000000, 0xb2b93b0e00000000, + 0x0715618e00000000, 0x948ea8f100000000, 0x2c4aa55500000000, + 0xbfd16c2a00000000, 0x0a7d36aa00000000, 0x99e6ffd500000000, + 0x359e2e7900000000, 0xa605e70600000000, 0x13a9bd8600000000, + 0x803274f900000000, 0x38f6795d00000000, 0xab6db02200000000, + 0x1ec1eaa200000000, 0x8d5a23dd00000000, 0x2f4e803100000000, + 0xbcd5494e00000000, 0x097913ce00000000, 0x9ae2dab100000000, + 0x2226d71500000000, 0xb1bd1e6a00000000, 0x041144ea00000000, + 0x978a8d9500000000, 0x013e73e800000000, 0x92a5ba9700000000, + 0x2709e01700000000, 0xb492296800000000, 0x0c5624cc00000000, + 0x9fcdedb300000000, 0x2a61b73300000000, 0xb9fa7e4c00000000, + 0x1beedda000000000, 0x887514df00000000, 0x3dd94e5f00000000, + 0xae42872000000000, 0x16868a8400000000, 0x851d43fb00000000, + 0x30b1197b00000000, 0xa32ad00400000000, 0x1cd8e48000000000, + 0x8f432dff00000000, 0x3aef777f00000000, 0xa974be0000000000, + 0x11b0b3a400000000, 0x822b7adb00000000, 0x3787205b00000000, + 0xa41ce92400000000, 0x06084ac800000000, 0x959383b700000000, + 0x203fd93700000000, 0xb3a4104800000000, 0x0b601dec00000000, + 0x98fbd49300000000, 0x2d578e1300000000, 0xbecc476c00000000, + 0x2878b91100000000, 0xbbe3706e00000000, 0x0e4f2aee00000000, + 0x9dd4e39100000000, 0x2510ee3500000000, 0xb68b274a00000000, + 0x03277dca00000000, 0x90bcb4b500000000, 0x32a8175900000000, + 0xa133de2600000000, 0x149f84a600000000, 0x87044dd900000000, + 0x3fc0407d00000000, 0xac5b890200000000, 0x19f7d38200000000, + 0x8a6c1afd00000000}, + {0x0000000000000000, 0x650b796900000000, 0xca16f2d200000000, + 0xaf1d8bbb00000000, 0xd52b957e00000000, 0xb020ec1700000000, + 0x1f3d67ac00000000, 0x7a361ec500000000, 0xaa572afd00000000, + 0xcf5c539400000000, 0x6041d82f00000000, 0x054aa14600000000, + 0x7f7cbf8300000000, 0x1a77c6ea00000000, 0xb56a4d5100000000, + 0xd061343800000000, 0x15a9252100000000, 0x70a25c4800000000, + 0xdfbfd7f300000000, 0xbab4ae9a00000000, 0xc082b05f00000000, + 0xa589c93600000000, 0x0a94428d00000000, 0x6f9f3be400000000, + 0xbffe0fdc00000000, 0xdaf576b500000000, 0x75e8fd0e00000000, + 0x10e3846700000000, 0x6ad59aa200000000, 0x0fdee3cb00000000, + 0xa0c3687000000000, 0xc5c8111900000000, 0x2a524b4200000000, + 0x4f59322b00000000, 0xe044b99000000000, 0x854fc0f900000000, + 0xff79de3c00000000, 0x9a72a75500000000, 0x356f2cee00000000, + 0x5064558700000000, 0x800561bf00000000, 0xe50e18d600000000, + 0x4a13936d00000000, 0x2f18ea0400000000, 0x552ef4c100000000, + 0x30258da800000000, 0x9f38061300000000, 0xfa337f7a00000000, + 0x3ffb6e6300000000, 0x5af0170a00000000, 0xf5ed9cb100000000, + 0x90e6e5d800000000, 0xead0fb1d00000000, 0x8fdb827400000000, + 0x20c609cf00000000, 0x45cd70a600000000, 0x95ac449e00000000, + 0xf0a73df700000000, 0x5fbab64c00000000, 0x3ab1cf2500000000, + 0x4087d1e000000000, 0x258ca88900000000, 0x8a91233200000000, + 0xef9a5a5b00000000, 0x54a4968400000000, 0x31afefed00000000, + 0x9eb2645600000000, 0xfbb91d3f00000000, 0x818f03fa00000000, + 0xe4847a9300000000, 0x4b99f12800000000, 0x2e92884100000000, + 0xfef3bc7900000000, 0x9bf8c51000000000, 0x34e54eab00000000, + 0x51ee37c200000000, 0x2bd8290700000000, 0x4ed3506e00000000, + 0xe1cedbd500000000, 0x84c5a2bc00000000, 0x410db3a500000000, + 0x2406cacc00000000, 0x8b1b417700000000, 0xee10381e00000000, + 0x942626db00000000, 0xf12d5fb200000000, 0x5e30d40900000000, + 0x3b3bad6000000000, 0xeb5a995800000000, 0x8e51e03100000000, + 0x214c6b8a00000000, 0x444712e300000000, 0x3e710c2600000000, + 0x5b7a754f00000000, 0xf467fef400000000, 0x916c879d00000000, + 0x7ef6ddc600000000, 0x1bfda4af00000000, 0xb4e02f1400000000, + 0xd1eb567d00000000, 0xabdd48b800000000, 0xced631d100000000, + 0x61cbba6a00000000, 0x04c0c30300000000, 0xd4a1f73b00000000, + 0xb1aa8e5200000000, 0x1eb705e900000000, 0x7bbc7c8000000000, + 0x018a624500000000, 0x64811b2c00000000, 0xcb9c909700000000, + 0xae97e9fe00000000, 0x6b5ff8e700000000, 0x0e54818e00000000, + 0xa1490a3500000000, 0xc442735c00000000, 0xbe746d9900000000, + 0xdb7f14f000000000, 0x74629f4b00000000, 0x1169e62200000000, + 0xc108d21a00000000, 0xa403ab7300000000, 0x0b1e20c800000000, + 0x6e1559a100000000, 0x1423476400000000, 0x71283e0d00000000, + 0xde35b5b600000000, 0xbb3eccdf00000000, 0xe94e5cd200000000, + 0x8c4525bb00000000, 0x2358ae0000000000, 0x4653d76900000000, + 0x3c65c9ac00000000, 0x596eb0c500000000, 0xf6733b7e00000000, + 0x9378421700000000, 0x4319762f00000000, 0x26120f4600000000, + 0x890f84fd00000000, 0xec04fd9400000000, 0x9632e35100000000, + 0xf3399a3800000000, 0x5c24118300000000, 0x392f68ea00000000, + 0xfce779f300000000, 0x99ec009a00000000, 0x36f18b2100000000, + 0x53faf24800000000, 0x29ccec8d00000000, 0x4cc795e400000000, + 0xe3da1e5f00000000, 0x86d1673600000000, 0x56b0530e00000000, + 0x33bb2a6700000000, 0x9ca6a1dc00000000, 0xf9add8b500000000, + 0x839bc67000000000, 0xe690bf1900000000, 0x498d34a200000000, + 0x2c864dcb00000000, 0xc31c179000000000, 0xa6176ef900000000, + 0x090ae54200000000, 0x6c019c2b00000000, 0x163782ee00000000, + 0x733cfb8700000000, 0xdc21703c00000000, 0xb92a095500000000, + 0x694b3d6d00000000, 0x0c40440400000000, 0xa35dcfbf00000000, + 0xc656b6d600000000, 0xbc60a81300000000, 0xd96bd17a00000000, + 0x76765ac100000000, 0x137d23a800000000, 0xd6b532b100000000, + 0xb3be4bd800000000, 0x1ca3c06300000000, 0x79a8b90a00000000, + 0x039ea7cf00000000, 0x6695dea600000000, 0xc988551d00000000, + 0xac832c7400000000, 0x7ce2184c00000000, 0x19e9612500000000, + 0xb6f4ea9e00000000, 0xd3ff93f700000000, 0xa9c98d3200000000, + 0xccc2f45b00000000, 0x63df7fe000000000, 0x06d4068900000000, + 0xbdeaca5600000000, 0xd8e1b33f00000000, 0x77fc388400000000, + 0x12f741ed00000000, 0x68c15f2800000000, 0x0dca264100000000, + 0xa2d7adfa00000000, 0xc7dcd49300000000, 0x17bde0ab00000000, + 0x72b699c200000000, 0xddab127900000000, 0xb8a06b1000000000, + 0xc29675d500000000, 0xa79d0cbc00000000, 0x0880870700000000, + 0x6d8bfe6e00000000, 0xa843ef7700000000, 0xcd48961e00000000, + 0x62551da500000000, 0x075e64cc00000000, 0x7d687a0900000000, + 0x1863036000000000, 0xb77e88db00000000, 0xd275f1b200000000, + 0x0214c58a00000000, 0x671fbce300000000, 0xc802375800000000, + 0xad094e3100000000, 0xd73f50f400000000, 0xb234299d00000000, + 0x1d29a22600000000, 0x7822db4f00000000, 0x97b8811400000000, + 0xf2b3f87d00000000, 0x5dae73c600000000, 0x38a50aaf00000000, + 0x4293146a00000000, 0x27986d0300000000, 0x8885e6b800000000, + 0xed8e9fd100000000, 0x3defabe900000000, 0x58e4d28000000000, + 0xf7f9593b00000000, 0x92f2205200000000, 0xe8c43e9700000000, + 0x8dcf47fe00000000, 0x22d2cc4500000000, 0x47d9b52c00000000, + 0x8211a43500000000, 0xe71add5c00000000, 0x480756e700000000, + 0x2d0c2f8e00000000, 0x573a314b00000000, 0x3231482200000000, + 0x9d2cc39900000000, 0xf827baf000000000, 0x28468ec800000000, + 0x4d4df7a100000000, 0xe2507c1a00000000, 0x875b057300000000, + 0xfd6d1bb600000000, 0x986662df00000000, 0x377be96400000000, + 0x5270900d00000000}, + {0x0000000000000000, 0xdcecb13d00000000, 0xb8d9637b00000000, + 0x6435d24600000000, 0x70b3c7f600000000, 0xac5f76cb00000000, + 0xc86aa48d00000000, 0x148615b000000000, 0xa160fe3600000000, + 0x7d8c4f0b00000000, 0x19b99d4d00000000, 0xc5552c7000000000, + 0xd1d339c000000000, 0x0d3f88fd00000000, 0x690a5abb00000000, + 0xb5e6eb8600000000, 0x42c1fc6d00000000, 0x9e2d4d5000000000, + 0xfa189f1600000000, 0x26f42e2b00000000, 0x32723b9b00000000, + 0xee9e8aa600000000, 0x8aab58e000000000, 0x5647e9dd00000000, + 0xe3a1025b00000000, 0x3f4db36600000000, 0x5b78612000000000, + 0x8794d01d00000000, 0x9312c5ad00000000, 0x4ffe749000000000, + 0x2bcba6d600000000, 0xf72717eb00000000, 0x8482f9db00000000, + 0x586e48e600000000, 0x3c5b9aa000000000, 0xe0b72b9d00000000, + 0xf4313e2d00000000, 0x28dd8f1000000000, 0x4ce85d5600000000, + 0x9004ec6b00000000, 0x25e207ed00000000, 0xf90eb6d000000000, + 0x9d3b649600000000, 0x41d7d5ab00000000, 0x5551c01b00000000, + 0x89bd712600000000, 0xed88a36000000000, 0x3164125d00000000, + 0xc64305b600000000, 0x1aafb48b00000000, 0x7e9a66cd00000000, + 0xa276d7f000000000, 0xb6f0c24000000000, 0x6a1c737d00000000, + 0x0e29a13b00000000, 0xd2c5100600000000, 0x6723fb8000000000, + 0xbbcf4abd00000000, 0xdffa98fb00000000, 0x031629c600000000, + 0x17903c7600000000, 0xcb7c8d4b00000000, 0xaf495f0d00000000, + 0x73a5ee3000000000, 0x4903826c00000000, 0x95ef335100000000, + 0xf1dae11700000000, 0x2d36502a00000000, 0x39b0459a00000000, + 0xe55cf4a700000000, 0x816926e100000000, 0x5d8597dc00000000, + 0xe8637c5a00000000, 0x348fcd6700000000, 0x50ba1f2100000000, + 0x8c56ae1c00000000, 0x98d0bbac00000000, 0x443c0a9100000000, + 0x2009d8d700000000, 0xfce569ea00000000, 0x0bc27e0100000000, + 0xd72ecf3c00000000, 0xb31b1d7a00000000, 0x6ff7ac4700000000, + 0x7b71b9f700000000, 0xa79d08ca00000000, 0xc3a8da8c00000000, + 0x1f446bb100000000, 0xaaa2803700000000, 0x764e310a00000000, + 0x127be34c00000000, 0xce97527100000000, 0xda1147c100000000, + 0x06fdf6fc00000000, 0x62c824ba00000000, 0xbe24958700000000, + 0xcd817bb700000000, 0x116dca8a00000000, 0x755818cc00000000, + 0xa9b4a9f100000000, 0xbd32bc4100000000, 0x61de0d7c00000000, + 0x05ebdf3a00000000, 0xd9076e0700000000, 0x6ce1858100000000, + 0xb00d34bc00000000, 0xd438e6fa00000000, 0x08d457c700000000, + 0x1c52427700000000, 0xc0bef34a00000000, 0xa48b210c00000000, + 0x7867903100000000, 0x8f4087da00000000, 0x53ac36e700000000, + 0x3799e4a100000000, 0xeb75559c00000000, 0xfff3402c00000000, + 0x231ff11100000000, 0x472a235700000000, 0x9bc6926a00000000, + 0x2e2079ec00000000, 0xf2ccc8d100000000, 0x96f91a9700000000, + 0x4a15abaa00000000, 0x5e93be1a00000000, 0x827f0f2700000000, + 0xe64add6100000000, 0x3aa66c5c00000000, 0x920604d900000000, + 0x4eeab5e400000000, 0x2adf67a200000000, 0xf633d69f00000000, + 0xe2b5c32f00000000, 0x3e59721200000000, 0x5a6ca05400000000, + 0x8680116900000000, 0x3366faef00000000, 0xef8a4bd200000000, + 0x8bbf999400000000, 0x575328a900000000, 0x43d53d1900000000, + 0x9f398c2400000000, 0xfb0c5e6200000000, 0x27e0ef5f00000000, + 0xd0c7f8b400000000, 0x0c2b498900000000, 0x681e9bcf00000000, + 0xb4f22af200000000, 0xa0743f4200000000, 0x7c988e7f00000000, + 0x18ad5c3900000000, 0xc441ed0400000000, 0x71a7068200000000, + 0xad4bb7bf00000000, 0xc97e65f900000000, 0x1592d4c400000000, + 0x0114c17400000000, 0xddf8704900000000, 0xb9cda20f00000000, + 0x6521133200000000, 0x1684fd0200000000, 0xca684c3f00000000, + 0xae5d9e7900000000, 0x72b12f4400000000, 0x66373af400000000, + 0xbadb8bc900000000, 0xdeee598f00000000, 0x0202e8b200000000, + 0xb7e4033400000000, 0x6b08b20900000000, 0x0f3d604f00000000, + 0xd3d1d17200000000, 0xc757c4c200000000, 0x1bbb75ff00000000, + 0x7f8ea7b900000000, 0xa362168400000000, 0x5445016f00000000, + 0x88a9b05200000000, 0xec9c621400000000, 0x3070d32900000000, + 0x24f6c69900000000, 0xf81a77a400000000, 0x9c2fa5e200000000, + 0x40c314df00000000, 0xf525ff5900000000, 0x29c94e6400000000, + 0x4dfc9c2200000000, 0x91102d1f00000000, 0x859638af00000000, + 0x597a899200000000, 0x3d4f5bd400000000, 0xe1a3eae900000000, + 0xdb0586b500000000, 0x07e9378800000000, 0x63dce5ce00000000, + 0xbf3054f300000000, 0xabb6414300000000, 0x775af07e00000000, + 0x136f223800000000, 0xcf83930500000000, 0x7a65788300000000, + 0xa689c9be00000000, 0xc2bc1bf800000000, 0x1e50aac500000000, + 0x0ad6bf7500000000, 0xd63a0e4800000000, 0xb20fdc0e00000000, + 0x6ee36d3300000000, 0x99c47ad800000000, 0x4528cbe500000000, + 0x211d19a300000000, 0xfdf1a89e00000000, 0xe977bd2e00000000, + 0x359b0c1300000000, 0x51aede5500000000, 0x8d426f6800000000, + 0x38a484ee00000000, 0xe44835d300000000, 0x807de79500000000, + 0x5c9156a800000000, 0x4817431800000000, 0x94fbf22500000000, + 0xf0ce206300000000, 0x2c22915e00000000, 0x5f877f6e00000000, + 0x836bce5300000000, 0xe75e1c1500000000, 0x3bb2ad2800000000, + 0x2f34b89800000000, 0xf3d809a500000000, 0x97eddbe300000000, + 0x4b016ade00000000, 0xfee7815800000000, 0x220b306500000000, + 0x463ee22300000000, 0x9ad2531e00000000, 0x8e5446ae00000000, + 0x52b8f79300000000, 0x368d25d500000000, 0xea6194e800000000, + 0x1d46830300000000, 0xc1aa323e00000000, 0xa59fe07800000000, + 0x7973514500000000, 0x6df544f500000000, 0xb119f5c800000000, + 0xd52c278e00000000, 0x09c096b300000000, 0xbc267d3500000000, + 0x60cacc0800000000, 0x04ff1e4e00000000, 0xd813af7300000000, + 0xcc95bac300000000, 0x10790bfe00000000, 0x744cd9b800000000, + 0xa8a0688500000000}}; + +#else /* W == 4 */ + +local const z_crc_t FAR crc_braid_table[][256] = { + {0x00000000, 0x81256527, 0xd93bcc0f, 0x581ea928, 0x69069e5f, + 0xe823fb78, 0xb03d5250, 0x31183777, 0xd20d3cbe, 0x53285999, + 0x0b36f0b1, 0x8a139596, 0xbb0ba2e1, 0x3a2ec7c6, 0x62306eee, + 0xe3150bc9, 0x7f6b7f3d, 0xfe4e1a1a, 0xa650b332, 0x2775d615, + 0x166de162, 0x97488445, 0xcf562d6d, 0x4e73484a, 0xad664383, + 0x2c4326a4, 0x745d8f8c, 0xf578eaab, 0xc460dddc, 0x4545b8fb, + 0x1d5b11d3, 0x9c7e74f4, 0xfed6fe7a, 0x7ff39b5d, 0x27ed3275, + 0xa6c85752, 0x97d06025, 0x16f50502, 0x4eebac2a, 0xcfcec90d, + 0x2cdbc2c4, 0xadfea7e3, 0xf5e00ecb, 0x74c56bec, 0x45dd5c9b, + 0xc4f839bc, 0x9ce69094, 0x1dc3f5b3, 0x81bd8147, 0x0098e460, + 0x58864d48, 0xd9a3286f, 0xe8bb1f18, 0x699e7a3f, 0x3180d317, + 0xb0a5b630, 0x53b0bdf9, 0xd295d8de, 0x8a8b71f6, 0x0bae14d1, + 0x3ab623a6, 0xbb934681, 0xe38defa9, 0x62a88a8e, 0x26dcfab5, + 0xa7f99f92, 0xffe736ba, 0x7ec2539d, 0x4fda64ea, 0xceff01cd, + 0x96e1a8e5, 0x17c4cdc2, 0xf4d1c60b, 0x75f4a32c, 0x2dea0a04, + 0xaccf6f23, 0x9dd75854, 0x1cf23d73, 0x44ec945b, 0xc5c9f17c, + 0x59b78588, 0xd892e0af, 0x808c4987, 0x01a92ca0, 0x30b11bd7, + 0xb1947ef0, 0xe98ad7d8, 0x68afb2ff, 0x8bbab936, 0x0a9fdc11, + 0x52817539, 0xd3a4101e, 0xe2bc2769, 0x6399424e, 0x3b87eb66, + 0xbaa28e41, 0xd80a04cf, 0x592f61e8, 0x0131c8c0, 0x8014ade7, + 0xb10c9a90, 0x3029ffb7, 0x6837569f, 0xe91233b8, 0x0a073871, + 0x8b225d56, 0xd33cf47e, 0x52199159, 0x6301a62e, 0xe224c309, + 0xba3a6a21, 0x3b1f0f06, 0xa7617bf2, 0x26441ed5, 0x7e5ab7fd, + 0xff7fd2da, 0xce67e5ad, 0x4f42808a, 0x175c29a2, 0x96794c85, + 0x756c474c, 0xf449226b, 0xac578b43, 0x2d72ee64, 0x1c6ad913, + 0x9d4fbc34, 0xc551151c, 0x4474703b, 0x4db9f56a, 0xcc9c904d, + 0x94823965, 0x15a75c42, 0x24bf6b35, 0xa59a0e12, 0xfd84a73a, + 0x7ca1c21d, 0x9fb4c9d4, 0x1e91acf3, 0x468f05db, 0xc7aa60fc, + 0xf6b2578b, 0x779732ac, 0x2f899b84, 0xaeacfea3, 0x32d28a57, + 0xb3f7ef70, 0xebe94658, 0x6acc237f, 0x5bd41408, 0xdaf1712f, + 0x82efd807, 0x03cabd20, 0xe0dfb6e9, 0x61fad3ce, 0x39e47ae6, + 0xb8c11fc1, 0x89d928b6, 0x08fc4d91, 0x50e2e4b9, 0xd1c7819e, + 0xb36f0b10, 0x324a6e37, 0x6a54c71f, 0xeb71a238, 0xda69954f, + 0x5b4cf068, 0x03525940, 0x82773c67, 0x616237ae, 0xe0475289, + 0xb859fba1, 0x397c9e86, 0x0864a9f1, 0x8941ccd6, 0xd15f65fe, + 0x507a00d9, 0xcc04742d, 0x4d21110a, 0x153fb822, 0x941add05, + 0xa502ea72, 0x24278f55, 0x7c39267d, 0xfd1c435a, 0x1e094893, + 0x9f2c2db4, 0xc732849c, 0x4617e1bb, 0x770fd6cc, 0xf62ab3eb, + 0xae341ac3, 0x2f117fe4, 0x6b650fdf, 0xea406af8, 0xb25ec3d0, + 0x337ba6f7, 0x02639180, 0x8346f4a7, 0xdb585d8f, 0x5a7d38a8, + 0xb9683361, 0x384d5646, 0x6053ff6e, 0xe1769a49, 0xd06ead3e, + 0x514bc819, 0x09556131, 0x88700416, 0x140e70e2, 0x952b15c5, + 0xcd35bced, 0x4c10d9ca, 0x7d08eebd, 0xfc2d8b9a, 0xa43322b2, + 0x25164795, 0xc6034c5c, 0x4726297b, 0x1f388053, 0x9e1de574, + 0xaf05d203, 0x2e20b724, 0x763e1e0c, 0xf71b7b2b, 0x95b3f1a5, + 0x14969482, 0x4c883daa, 0xcdad588d, 0xfcb56ffa, 0x7d900add, + 0x258ea3f5, 0xa4abc6d2, 0x47becd1b, 0xc69ba83c, 0x9e850114, + 0x1fa06433, 0x2eb85344, 0xaf9d3663, 0xf7839f4b, 0x76a6fa6c, + 0xead88e98, 0x6bfdebbf, 0x33e34297, 0xb2c627b0, 0x83de10c7, + 0x02fb75e0, 0x5ae5dcc8, 0xdbc0b9ef, 0x38d5b226, 0xb9f0d701, + 0xe1ee7e29, 0x60cb1b0e, 0x51d32c79, 0xd0f6495e, 0x88e8e076, + 0x09cd8551}, + {0x00000000, 0x9b73ead4, 0xed96d3e9, 0x76e5393d, 0x005ca193, + 0x9b2f4b47, 0xedca727a, 0x76b998ae, 0x00b94326, 0x9bcaa9f2, + 0xed2f90cf, 0x765c7a1b, 0x00e5e2b5, 0x9b960861, 0xed73315c, + 0x7600db88, 0x0172864c, 0x9a016c98, 0xece455a5, 0x7797bf71, + 0x012e27df, 0x9a5dcd0b, 0xecb8f436, 0x77cb1ee2, 0x01cbc56a, + 0x9ab82fbe, 0xec5d1683, 0x772efc57, 0x019764f9, 0x9ae48e2d, + 0xec01b710, 0x77725dc4, 0x02e50c98, 0x9996e64c, 0xef73df71, + 0x740035a5, 0x02b9ad0b, 0x99ca47df, 0xef2f7ee2, 0x745c9436, + 0x025c4fbe, 0x992fa56a, 0xefca9c57, 0x74b97683, 0x0200ee2d, + 0x997304f9, 0xef963dc4, 0x74e5d710, 0x03978ad4, 0x98e46000, + 0xee01593d, 0x7572b3e9, 0x03cb2b47, 0x98b8c193, 0xee5df8ae, + 0x752e127a, 0x032ec9f2, 0x985d2326, 0xeeb81a1b, 0x75cbf0cf, + 0x03726861, 0x980182b5, 0xeee4bb88, 0x7597515c, 0x05ca1930, + 0x9eb9f3e4, 0xe85ccad9, 0x732f200d, 0x0596b8a3, 0x9ee55277, + 0xe8006b4a, 0x7373819e, 0x05735a16, 0x9e00b0c2, 0xe8e589ff, + 0x7396632b, 0x052ffb85, 0x9e5c1151, 0xe8b9286c, 0x73cac2b8, + 0x04b89f7c, 0x9fcb75a8, 0xe92e4c95, 0x725da641, 0x04e43eef, + 0x9f97d43b, 0xe972ed06, 0x720107d2, 0x0401dc5a, 0x9f72368e, + 0xe9970fb3, 0x72e4e567, 0x045d7dc9, 0x9f2e971d, 0xe9cbae20, + 0x72b844f4, 0x072f15a8, 0x9c5cff7c, 0xeab9c641, 0x71ca2c95, + 0x0773b43b, 0x9c005eef, 0xeae567d2, 0x71968d06, 0x0796568e, + 0x9ce5bc5a, 0xea008567, 0x71736fb3, 0x07caf71d, 0x9cb91dc9, + 0xea5c24f4, 0x712fce20, 0x065d93e4, 0x9d2e7930, 0xebcb400d, + 0x70b8aad9, 0x06013277, 0x9d72d8a3, 0xeb97e19e, 0x70e40b4a, + 0x06e4d0c2, 0x9d973a16, 0xeb72032b, 0x7001e9ff, 0x06b87151, + 0x9dcb9b85, 0xeb2ea2b8, 0x705d486c, 0x0b943260, 0x90e7d8b4, + 0xe602e189, 0x7d710b5d, 0x0bc893f3, 0x90bb7927, 0xe65e401a, + 0x7d2daace, 0x0b2d7146, 0x905e9b92, 0xe6bba2af, 0x7dc8487b, + 0x0b71d0d5, 0x90023a01, 0xe6e7033c, 0x7d94e9e8, 0x0ae6b42c, + 0x91955ef8, 0xe77067c5, 0x7c038d11, 0x0aba15bf, 0x91c9ff6b, + 0xe72cc656, 0x7c5f2c82, 0x0a5ff70a, 0x912c1dde, 0xe7c924e3, + 0x7cbace37, 0x0a035699, 0x9170bc4d, 0xe7958570, 0x7ce66fa4, + 0x09713ef8, 0x9202d42c, 0xe4e7ed11, 0x7f9407c5, 0x092d9f6b, + 0x925e75bf, 0xe4bb4c82, 0x7fc8a656, 0x09c87dde, 0x92bb970a, + 0xe45eae37, 0x7f2d44e3, 0x0994dc4d, 0x92e73699, 0xe4020fa4, + 0x7f71e570, 0x0803b8b4, 0x93705260, 0xe5956b5d, 0x7ee68189, + 0x085f1927, 0x932cf3f3, 0xe5c9cace, 0x7eba201a, 0x08bafb92, + 0x93c91146, 0xe52c287b, 0x7e5fc2af, 0x08e65a01, 0x9395b0d5, + 0xe57089e8, 0x7e03633c, 0x0e5e2b50, 0x952dc184, 0xe3c8f8b9, + 0x78bb126d, 0x0e028ac3, 0x95716017, 0xe394592a, 0x78e7b3fe, + 0x0ee76876, 0x959482a2, 0xe371bb9f, 0x7802514b, 0x0ebbc9e5, + 0x95c82331, 0xe32d1a0c, 0x785ef0d8, 0x0f2cad1c, 0x945f47c8, + 0xe2ba7ef5, 0x79c99421, 0x0f700c8f, 0x9403e65b, 0xe2e6df66, + 0x799535b2, 0x0f95ee3a, 0x94e604ee, 0xe2033dd3, 0x7970d707, + 0x0fc94fa9, 0x94baa57d, 0xe25f9c40, 0x792c7694, 0x0cbb27c8, + 0x97c8cd1c, 0xe12df421, 0x7a5e1ef5, 0x0ce7865b, 0x97946c8f, + 0xe17155b2, 0x7a02bf66, 0x0c0264ee, 0x97718e3a, 0xe194b707, + 0x7ae75dd3, 0x0c5ec57d, 0x972d2fa9, 0xe1c81694, 0x7abbfc40, + 0x0dc9a184, 0x96ba4b50, 0xe05f726d, 0x7b2c98b9, 0x0d950017, + 0x96e6eac3, 0xe003d3fe, 0x7b70392a, 0x0d70e2a2, 0x96030876, + 0xe0e6314b, 0x7b95db9f, 0x0d2c4331, 0x965fa9e5, 0xe0ba90d8, + 0x7bc97a0c}, + {0x00000000, 0x172864c0, 0x2e50c980, 0x3978ad40, 0x5ca19300, + 0x4b89f7c0, 0x72f15a80, 0x65d93e40, 0xb9432600, 0xae6b42c0, + 0x9713ef80, 0x803b8b40, 0xe5e2b500, 0xf2cad1c0, 0xcbb27c80, + 0xdc9a1840, 0xa9f74a41, 0xbedf2e81, 0x87a783c1, 0x908fe701, + 0xf556d941, 0xe27ebd81, 0xdb0610c1, 0xcc2e7401, 0x10b46c41, + 0x079c0881, 0x3ee4a5c1, 0x29ccc101, 0x4c15ff41, 0x5b3d9b81, + 0x624536c1, 0x756d5201, 0x889f92c3, 0x9fb7f603, 0xa6cf5b43, + 0xb1e73f83, 0xd43e01c3, 0xc3166503, 0xfa6ec843, 0xed46ac83, + 0x31dcb4c3, 0x26f4d003, 0x1f8c7d43, 0x08a41983, 0x6d7d27c3, + 0x7a554303, 0x432dee43, 0x54058a83, 0x2168d882, 0x3640bc42, + 0x0f381102, 0x181075c2, 0x7dc94b82, 0x6ae12f42, 0x53998202, + 0x44b1e6c2, 0x982bfe82, 0x8f039a42, 0xb67b3702, 0xa15353c2, + 0xc48a6d82, 0xd3a20942, 0xeadaa402, 0xfdf2c0c2, 0xca4e23c7, + 0xdd664707, 0xe41eea47, 0xf3368e87, 0x96efb0c7, 0x81c7d407, + 0xb8bf7947, 0xaf971d87, 0x730d05c7, 0x64256107, 0x5d5dcc47, + 0x4a75a887, 0x2fac96c7, 0x3884f207, 0x01fc5f47, 0x16d43b87, + 0x63b96986, 0x74910d46, 0x4de9a006, 0x5ac1c4c6, 0x3f18fa86, + 0x28309e46, 0x11483306, 0x066057c6, 0xdafa4f86, 0xcdd22b46, + 0xf4aa8606, 0xe382e2c6, 0x865bdc86, 0x9173b846, 0xa80b1506, + 0xbf2371c6, 0x42d1b104, 0x55f9d5c4, 0x6c817884, 0x7ba91c44, + 0x1e702204, 0x095846c4, 0x3020eb84, 0x27088f44, 0xfb929704, + 0xecbaf3c4, 0xd5c25e84, 0xc2ea3a44, 0xa7330404, 0xb01b60c4, + 0x8963cd84, 0x9e4ba944, 0xeb26fb45, 0xfc0e9f85, 0xc57632c5, + 0xd25e5605, 0xb7876845, 0xa0af0c85, 0x99d7a1c5, 0x8effc505, + 0x5265dd45, 0x454db985, 0x7c3514c5, 0x6b1d7005, 0x0ec44e45, + 0x19ec2a85, 0x209487c5, 0x37bce305, 0x4fed41cf, 0x58c5250f, + 0x61bd884f, 0x7695ec8f, 0x134cd2cf, 0x0464b60f, 0x3d1c1b4f, + 0x2a347f8f, 0xf6ae67cf, 0xe186030f, 0xd8feae4f, 0xcfd6ca8f, + 0xaa0ff4cf, 0xbd27900f, 0x845f3d4f, 0x9377598f, 0xe61a0b8e, + 0xf1326f4e, 0xc84ac20e, 0xdf62a6ce, 0xbabb988e, 0xad93fc4e, + 0x94eb510e, 0x83c335ce, 0x5f592d8e, 0x4871494e, 0x7109e40e, + 0x662180ce, 0x03f8be8e, 0x14d0da4e, 0x2da8770e, 0x3a8013ce, + 0xc772d30c, 0xd05ab7cc, 0xe9221a8c, 0xfe0a7e4c, 0x9bd3400c, + 0x8cfb24cc, 0xb583898c, 0xa2abed4c, 0x7e31f50c, 0x691991cc, + 0x50613c8c, 0x4749584c, 0x2290660c, 0x35b802cc, 0x0cc0af8c, + 0x1be8cb4c, 0x6e85994d, 0x79adfd8d, 0x40d550cd, 0x57fd340d, + 0x32240a4d, 0x250c6e8d, 0x1c74c3cd, 0x0b5ca70d, 0xd7c6bf4d, + 0xc0eedb8d, 0xf99676cd, 0xeebe120d, 0x8b672c4d, 0x9c4f488d, + 0xa537e5cd, 0xb21f810d, 0x85a36208, 0x928b06c8, 0xabf3ab88, + 0xbcdbcf48, 0xd902f108, 0xce2a95c8, 0xf7523888, 0xe07a5c48, + 0x3ce04408, 0x2bc820c8, 0x12b08d88, 0x0598e948, 0x6041d708, + 0x7769b3c8, 0x4e111e88, 0x59397a48, 0x2c542849, 0x3b7c4c89, + 0x0204e1c9, 0x152c8509, 0x70f5bb49, 0x67dddf89, 0x5ea572c9, + 0x498d1609, 0x95170e49, 0x823f6a89, 0xbb47c7c9, 0xac6fa309, + 0xc9b69d49, 0xde9ef989, 0xe7e654c9, 0xf0ce3009, 0x0d3cf0cb, + 0x1a14940b, 0x236c394b, 0x34445d8b, 0x519d63cb, 0x46b5070b, + 0x7fcdaa4b, 0x68e5ce8b, 0xb47fd6cb, 0xa357b20b, 0x9a2f1f4b, + 0x8d077b8b, 0xe8de45cb, 0xfff6210b, 0xc68e8c4b, 0xd1a6e88b, + 0xa4cbba8a, 0xb3e3de4a, 0x8a9b730a, 0x9db317ca, 0xf86a298a, + 0xef424d4a, 0xd63ae00a, 0xc11284ca, 0x1d889c8a, 0x0aa0f84a, + 0x33d8550a, 0x24f031ca, 0x41290f8a, 0x56016b4a, 0x6f79c60a, + 0x7851a2ca}, + {0x00000000, 0x9fda839e, 0xe4c4017d, 0x7b1e82e3, 0x12f904bb, + 0x8d238725, 0xf63d05c6, 0x69e78658, 0x25f20976, 0xba288ae8, + 0xc136080b, 0x5eec8b95, 0x370b0dcd, 0xa8d18e53, 0xd3cf0cb0, + 0x4c158f2e, 0x4be412ec, 0xd43e9172, 0xaf201391, 0x30fa900f, + 0x591d1657, 0xc6c795c9, 0xbdd9172a, 0x220394b4, 0x6e161b9a, + 0xf1cc9804, 0x8ad21ae7, 0x15089979, 0x7cef1f21, 0xe3359cbf, + 0x982b1e5c, 0x07f19dc2, 0x97c825d8, 0x0812a646, 0x730c24a5, + 0xecd6a73b, 0x85312163, 0x1aeba2fd, 0x61f5201e, 0xfe2fa380, + 0xb23a2cae, 0x2de0af30, 0x56fe2dd3, 0xc924ae4d, 0xa0c32815, + 0x3f19ab8b, 0x44072968, 0xdbddaaf6, 0xdc2c3734, 0x43f6b4aa, + 0x38e83649, 0xa732b5d7, 0xced5338f, 0x510fb011, 0x2a1132f2, + 0xb5cbb16c, 0xf9de3e42, 0x6604bddc, 0x1d1a3f3f, 0x82c0bca1, + 0xeb273af9, 0x74fdb967, 0x0fe33b84, 0x9039b81a, 0xf4e14df1, + 0x6b3bce6f, 0x10254c8c, 0x8fffcf12, 0xe618494a, 0x79c2cad4, + 0x02dc4837, 0x9d06cba9, 0xd1134487, 0x4ec9c719, 0x35d745fa, + 0xaa0dc664, 0xc3ea403c, 0x5c30c3a2, 0x272e4141, 0xb8f4c2df, + 0xbf055f1d, 0x20dfdc83, 0x5bc15e60, 0xc41bddfe, 0xadfc5ba6, + 0x3226d838, 0x49385adb, 0xd6e2d945, 0x9af7566b, 0x052dd5f5, + 0x7e335716, 0xe1e9d488, 0x880e52d0, 0x17d4d14e, 0x6cca53ad, + 0xf310d033, 0x63296829, 0xfcf3ebb7, 0x87ed6954, 0x1837eaca, + 0x71d06c92, 0xee0aef0c, 0x95146def, 0x0aceee71, 0x46db615f, + 0xd901e2c1, 0xa21f6022, 0x3dc5e3bc, 0x542265e4, 0xcbf8e67a, + 0xb0e66499, 0x2f3ce707, 0x28cd7ac5, 0xb717f95b, 0xcc097bb8, + 0x53d3f826, 0x3a347e7e, 0xa5eefde0, 0xdef07f03, 0x412afc9d, + 0x0d3f73b3, 0x92e5f02d, 0xe9fb72ce, 0x7621f150, 0x1fc67708, + 0x801cf496, 0xfb027675, 0x64d8f5eb, 0x32b39da3, 0xad691e3d, + 0xd6779cde, 0x49ad1f40, 0x204a9918, 0xbf901a86, 0xc48e9865, + 0x5b541bfb, 0x174194d5, 0x889b174b, 0xf38595a8, 0x6c5f1636, + 0x05b8906e, 0x9a6213f0, 0xe17c9113, 0x7ea6128d, 0x79578f4f, + 0xe68d0cd1, 0x9d938e32, 0x02490dac, 0x6bae8bf4, 0xf474086a, + 0x8f6a8a89, 0x10b00917, 0x5ca58639, 0xc37f05a7, 0xb8618744, + 0x27bb04da, 0x4e5c8282, 0xd186011c, 0xaa9883ff, 0x35420061, + 0xa57bb87b, 0x3aa13be5, 0x41bfb906, 0xde653a98, 0xb782bcc0, + 0x28583f5e, 0x5346bdbd, 0xcc9c3e23, 0x8089b10d, 0x1f533293, + 0x644db070, 0xfb9733ee, 0x9270b5b6, 0x0daa3628, 0x76b4b4cb, + 0xe96e3755, 0xee9faa97, 0x71452909, 0x0a5babea, 0x95812874, + 0xfc66ae2c, 0x63bc2db2, 0x18a2af51, 0x87782ccf, 0xcb6da3e1, + 0x54b7207f, 0x2fa9a29c, 0xb0732102, 0xd994a75a, 0x464e24c4, + 0x3d50a627, 0xa28a25b9, 0xc652d052, 0x598853cc, 0x2296d12f, + 0xbd4c52b1, 0xd4abd4e9, 0x4b715777, 0x306fd594, 0xafb5560a, + 0xe3a0d924, 0x7c7a5aba, 0x0764d859, 0x98be5bc7, 0xf159dd9f, + 0x6e835e01, 0x159ddce2, 0x8a475f7c, 0x8db6c2be, 0x126c4120, + 0x6972c3c3, 0xf6a8405d, 0x9f4fc605, 0x0095459b, 0x7b8bc778, + 0xe45144e6, 0xa844cbc8, 0x379e4856, 0x4c80cab5, 0xd35a492b, + 0xbabdcf73, 0x25674ced, 0x5e79ce0e, 0xc1a34d90, 0x519af58a, + 0xce407614, 0xb55ef4f7, 0x2a847769, 0x4363f131, 0xdcb972af, + 0xa7a7f04c, 0x387d73d2, 0x7468fcfc, 0xebb27f62, 0x90acfd81, + 0x0f767e1f, 0x6691f847, 0xf94b7bd9, 0x8255f93a, 0x1d8f7aa4, + 0x1a7ee766, 0x85a464f8, 0xfebae61b, 0x61606585, 0x0887e3dd, + 0x975d6043, 0xec43e2a0, 0x7399613e, 0x3f8cee10, 0xa0566d8e, + 0xdb48ef6d, 0x44926cf3, 0x2d75eaab, 0xb2af6935, 0xc9b1ebd6, + 0x566b6848}}; + +local const z_word_t FAR crc_braid_big_table[][256] = { + {0x00000000, 0x9e83da9f, 0x7d01c4e4, 0xe3821e7b, 0xbb04f912, + 0x2587238d, 0xc6053df6, 0x5886e769, 0x7609f225, 0xe88a28ba, + 0x0b0836c1, 0x958bec5e, 0xcd0d0b37, 0x538ed1a8, 0xb00ccfd3, + 0x2e8f154c, 0xec12e44b, 0x72913ed4, 0x911320af, 0x0f90fa30, + 0x57161d59, 0xc995c7c6, 0x2a17d9bd, 0xb4940322, 0x9a1b166e, + 0x0498ccf1, 0xe71ad28a, 0x79990815, 0x211fef7c, 0xbf9c35e3, + 0x5c1e2b98, 0xc29df107, 0xd825c897, 0x46a61208, 0xa5240c73, + 0x3ba7d6ec, 0x63213185, 0xfda2eb1a, 0x1e20f561, 0x80a32ffe, + 0xae2c3ab2, 0x30afe02d, 0xd32dfe56, 0x4dae24c9, 0x1528c3a0, + 0x8bab193f, 0x68290744, 0xf6aadddb, 0x34372cdc, 0xaab4f643, + 0x4936e838, 0xd7b532a7, 0x8f33d5ce, 0x11b00f51, 0xf232112a, + 0x6cb1cbb5, 0x423edef9, 0xdcbd0466, 0x3f3f1a1d, 0xa1bcc082, + 0xf93a27eb, 0x67b9fd74, 0x843be30f, 0x1ab83990, 0xf14de1f4, + 0x6fce3b6b, 0x8c4c2510, 0x12cfff8f, 0x4a4918e6, 0xd4cac279, + 0x3748dc02, 0xa9cb069d, 0x874413d1, 0x19c7c94e, 0xfa45d735, + 0x64c60daa, 0x3c40eac3, 0xa2c3305c, 0x41412e27, 0xdfc2f4b8, + 0x1d5f05bf, 0x83dcdf20, 0x605ec15b, 0xfedd1bc4, 0xa65bfcad, + 0x38d82632, 0xdb5a3849, 0x45d9e2d6, 0x6b56f79a, 0xf5d52d05, + 0x1657337e, 0x88d4e9e1, 0xd0520e88, 0x4ed1d417, 0xad53ca6c, + 0x33d010f3, 0x29682963, 0xb7ebf3fc, 0x5469ed87, 0xcaea3718, + 0x926cd071, 0x0cef0aee, 0xef6d1495, 0x71eece0a, 0x5f61db46, + 0xc1e201d9, 0x22601fa2, 0xbce3c53d, 0xe4652254, 0x7ae6f8cb, + 0x9964e6b0, 0x07e73c2f, 0xc57acd28, 0x5bf917b7, 0xb87b09cc, + 0x26f8d353, 0x7e7e343a, 0xe0fdeea5, 0x037ff0de, 0x9dfc2a41, + 0xb3733f0d, 0x2df0e592, 0xce72fbe9, 0x50f12176, 0x0877c61f, + 0x96f41c80, 0x757602fb, 0xebf5d864, 0xa39db332, 0x3d1e69ad, + 0xde9c77d6, 0x401fad49, 0x18994a20, 0x861a90bf, 0x65988ec4, + 0xfb1b545b, 0xd5944117, 0x4b179b88, 0xa89585f3, 0x36165f6c, + 0x6e90b805, 0xf013629a, 0x13917ce1, 0x8d12a67e, 0x4f8f5779, + 0xd10c8de6, 0x328e939d, 0xac0d4902, 0xf48bae6b, 0x6a0874f4, + 0x898a6a8f, 0x1709b010, 0x3986a55c, 0xa7057fc3, 0x448761b8, + 0xda04bb27, 0x82825c4e, 0x1c0186d1, 0xff8398aa, 0x61004235, + 0x7bb87ba5, 0xe53ba13a, 0x06b9bf41, 0x983a65de, 0xc0bc82b7, + 0x5e3f5828, 0xbdbd4653, 0x233e9ccc, 0x0db18980, 0x9332531f, + 0x70b04d64, 0xee3397fb, 0xb6b57092, 0x2836aa0d, 0xcbb4b476, + 0x55376ee9, 0x97aa9fee, 0x09294571, 0xeaab5b0a, 0x74288195, + 0x2cae66fc, 0xb22dbc63, 0x51afa218, 0xcf2c7887, 0xe1a36dcb, + 0x7f20b754, 0x9ca2a92f, 0x022173b0, 0x5aa794d9, 0xc4244e46, + 0x27a6503d, 0xb9258aa2, 0x52d052c6, 0xcc538859, 0x2fd19622, + 0xb1524cbd, 0xe9d4abd4, 0x7757714b, 0x94d56f30, 0x0a56b5af, + 0x24d9a0e3, 0xba5a7a7c, 0x59d86407, 0xc75bbe98, 0x9fdd59f1, + 0x015e836e, 0xe2dc9d15, 0x7c5f478a, 0xbec2b68d, 0x20416c12, + 0xc3c37269, 0x5d40a8f6, 0x05c64f9f, 0x9b459500, 0x78c78b7b, + 0xe64451e4, 0xc8cb44a8, 0x56489e37, 0xb5ca804c, 0x2b495ad3, + 0x73cfbdba, 0xed4c6725, 0x0ece795e, 0x904da3c1, 0x8af59a51, + 0x147640ce, 0xf7f45eb5, 0x6977842a, 0x31f16343, 0xaf72b9dc, + 0x4cf0a7a7, 0xd2737d38, 0xfcfc6874, 0x627fb2eb, 0x81fdac90, + 0x1f7e760f, 0x47f89166, 0xd97b4bf9, 0x3af95582, 0xa47a8f1d, + 0x66e77e1a, 0xf864a485, 0x1be6bafe, 0x85656061, 0xdde38708, + 0x43605d97, 0xa0e243ec, 0x3e619973, 0x10ee8c3f, 0x8e6d56a0, + 0x6def48db, 0xf36c9244, 0xabea752d, 0x3569afb2, 0xd6ebb1c9, + 0x48686b56}, + {0x00000000, 0xc0642817, 0x80c9502e, 0x40ad7839, 0x0093a15c, + 0xc0f7894b, 0x805af172, 0x403ed965, 0x002643b9, 0xc0426bae, + 0x80ef1397, 0x408b3b80, 0x00b5e2e5, 0xc0d1caf2, 0x807cb2cb, + 0x40189adc, 0x414af7a9, 0x812edfbe, 0xc183a787, 0x01e78f90, + 0x41d956f5, 0x81bd7ee2, 0xc11006db, 0x01742ecc, 0x416cb410, + 0x81089c07, 0xc1a5e43e, 0x01c1cc29, 0x41ff154c, 0x819b3d5b, + 0xc1364562, 0x01526d75, 0xc3929f88, 0x03f6b79f, 0x435bcfa6, + 0x833fe7b1, 0xc3013ed4, 0x036516c3, 0x43c86efa, 0x83ac46ed, + 0xc3b4dc31, 0x03d0f426, 0x437d8c1f, 0x8319a408, 0xc3277d6d, + 0x0343557a, 0x43ee2d43, 0x838a0554, 0x82d86821, 0x42bc4036, + 0x0211380f, 0xc2751018, 0x824bc97d, 0x422fe16a, 0x02829953, + 0xc2e6b144, 0x82fe2b98, 0x429a038f, 0x02377bb6, 0xc25353a1, + 0x826d8ac4, 0x4209a2d3, 0x02a4daea, 0xc2c0f2fd, 0xc7234eca, + 0x074766dd, 0x47ea1ee4, 0x878e36f3, 0xc7b0ef96, 0x07d4c781, + 0x4779bfb8, 0x871d97af, 0xc7050d73, 0x07612564, 0x47cc5d5d, + 0x87a8754a, 0xc796ac2f, 0x07f28438, 0x475ffc01, 0x873bd416, + 0x8669b963, 0x460d9174, 0x06a0e94d, 0xc6c4c15a, 0x86fa183f, + 0x469e3028, 0x06334811, 0xc6576006, 0x864ffada, 0x462bd2cd, + 0x0686aaf4, 0xc6e282e3, 0x86dc5b86, 0x46b87391, 0x06150ba8, + 0xc67123bf, 0x04b1d142, 0xc4d5f955, 0x8478816c, 0x441ca97b, + 0x0422701e, 0xc4465809, 0x84eb2030, 0x448f0827, 0x049792fb, + 0xc4f3baec, 0x845ec2d5, 0x443aeac2, 0x040433a7, 0xc4601bb0, + 0x84cd6389, 0x44a94b9e, 0x45fb26eb, 0x859f0efc, 0xc53276c5, + 0x05565ed2, 0x456887b7, 0x850cafa0, 0xc5a1d799, 0x05c5ff8e, + 0x45dd6552, 0x85b94d45, 0xc514357c, 0x05701d6b, 0x454ec40e, + 0x852aec19, 0xc5879420, 0x05e3bc37, 0xcf41ed4f, 0x0f25c558, + 0x4f88bd61, 0x8fec9576, 0xcfd24c13, 0x0fb66404, 0x4f1b1c3d, + 0x8f7f342a, 0xcf67aef6, 0x0f0386e1, 0x4faefed8, 0x8fcad6cf, + 0xcff40faa, 0x0f9027bd, 0x4f3d5f84, 0x8f597793, 0x8e0b1ae6, + 0x4e6f32f1, 0x0ec24ac8, 0xcea662df, 0x8e98bbba, 0x4efc93ad, + 0x0e51eb94, 0xce35c383, 0x8e2d595f, 0x4e497148, 0x0ee40971, + 0xce802166, 0x8ebef803, 0x4edad014, 0x0e77a82d, 0xce13803a, + 0x0cd372c7, 0xccb75ad0, 0x8c1a22e9, 0x4c7e0afe, 0x0c40d39b, + 0xcc24fb8c, 0x8c8983b5, 0x4cedaba2, 0x0cf5317e, 0xcc911969, + 0x8c3c6150, 0x4c584947, 0x0c669022, 0xcc02b835, 0x8cafc00c, + 0x4ccbe81b, 0x4d99856e, 0x8dfdad79, 0xcd50d540, 0x0d34fd57, + 0x4d0a2432, 0x8d6e0c25, 0xcdc3741c, 0x0da75c0b, 0x4dbfc6d7, + 0x8ddbeec0, 0xcd7696f9, 0x0d12beee, 0x4d2c678b, 0x8d484f9c, + 0xcde537a5, 0x0d811fb2, 0x0862a385, 0xc8068b92, 0x88abf3ab, + 0x48cfdbbc, 0x08f102d9, 0xc8952ace, 0x883852f7, 0x485c7ae0, + 0x0844e03c, 0xc820c82b, 0x888db012, 0x48e99805, 0x08d74160, + 0xc8b36977, 0x881e114e, 0x487a3959, 0x4928542c, 0x894c7c3b, + 0xc9e10402, 0x09852c15, 0x49bbf570, 0x89dfdd67, 0xc972a55e, + 0x09168d49, 0x490e1795, 0x896a3f82, 0xc9c747bb, 0x09a36fac, + 0x499db6c9, 0x89f99ede, 0xc954e6e7, 0x0930cef0, 0xcbf03c0d, + 0x0b94141a, 0x4b396c23, 0x8b5d4434, 0xcb639d51, 0x0b07b546, + 0x4baacd7f, 0x8bcee568, 0xcbd67fb4, 0x0bb257a3, 0x4b1f2f9a, + 0x8b7b078d, 0xcb45dee8, 0x0b21f6ff, 0x4b8c8ec6, 0x8be8a6d1, + 0x8abacba4, 0x4adee3b3, 0x0a739b8a, 0xca17b39d, 0x8a296af8, + 0x4a4d42ef, 0x0ae03ad6, 0xca8412c1, 0x8a9c881d, 0x4af8a00a, + 0x0a55d833, 0xca31f024, 0x8a0f2941, 0x4a6b0156, 0x0ac6796f, + 0xcaa25178}, + {0x00000000, 0xd4ea739b, 0xe9d396ed, 0x3d39e576, 0x93a15c00, + 0x474b2f9b, 0x7a72caed, 0xae98b976, 0x2643b900, 0xf2a9ca9b, + 0xcf902fed, 0x1b7a5c76, 0xb5e2e500, 0x6108969b, 0x5c3173ed, + 0x88db0076, 0x4c867201, 0x986c019a, 0xa555e4ec, 0x71bf9777, + 0xdf272e01, 0x0bcd5d9a, 0x36f4b8ec, 0xe21ecb77, 0x6ac5cb01, + 0xbe2fb89a, 0x83165dec, 0x57fc2e77, 0xf9649701, 0x2d8ee49a, + 0x10b701ec, 0xc45d7277, 0x980ce502, 0x4ce69699, 0x71df73ef, + 0xa5350074, 0x0badb902, 0xdf47ca99, 0xe27e2fef, 0x36945c74, + 0xbe4f5c02, 0x6aa52f99, 0x579ccaef, 0x8376b974, 0x2dee0002, + 0xf9047399, 0xc43d96ef, 0x10d7e574, 0xd48a9703, 0x0060e498, + 0x3d5901ee, 0xe9b37275, 0x472bcb03, 0x93c1b898, 0xaef85dee, + 0x7a122e75, 0xf2c92e03, 0x26235d98, 0x1b1ab8ee, 0xcff0cb75, + 0x61687203, 0xb5820198, 0x88bbe4ee, 0x5c519775, 0x3019ca05, + 0xe4f3b99e, 0xd9ca5ce8, 0x0d202f73, 0xa3b89605, 0x7752e59e, + 0x4a6b00e8, 0x9e817373, 0x165a7305, 0xc2b0009e, 0xff89e5e8, + 0x2b639673, 0x85fb2f05, 0x51115c9e, 0x6c28b9e8, 0xb8c2ca73, + 0x7c9fb804, 0xa875cb9f, 0x954c2ee9, 0x41a65d72, 0xef3ee404, + 0x3bd4979f, 0x06ed72e9, 0xd2070172, 0x5adc0104, 0x8e36729f, + 0xb30f97e9, 0x67e5e472, 0xc97d5d04, 0x1d972e9f, 0x20aecbe9, + 0xf444b872, 0xa8152f07, 0x7cff5c9c, 0x41c6b9ea, 0x952cca71, + 0x3bb47307, 0xef5e009c, 0xd267e5ea, 0x068d9671, 0x8e569607, + 0x5abce59c, 0x678500ea, 0xb36f7371, 0x1df7ca07, 0xc91db99c, + 0xf4245cea, 0x20ce2f71, 0xe4935d06, 0x30792e9d, 0x0d40cbeb, + 0xd9aab870, 0x77320106, 0xa3d8729d, 0x9ee197eb, 0x4a0be470, + 0xc2d0e406, 0x163a979d, 0x2b0372eb, 0xffe90170, 0x5171b806, + 0x859bcb9d, 0xb8a22eeb, 0x6c485d70, 0x6032940b, 0xb4d8e790, + 0x89e102e6, 0x5d0b717d, 0xf393c80b, 0x2779bb90, 0x1a405ee6, + 0xceaa2d7d, 0x46712d0b, 0x929b5e90, 0xafa2bbe6, 0x7b48c87d, + 0xd5d0710b, 0x013a0290, 0x3c03e7e6, 0xe8e9947d, 0x2cb4e60a, + 0xf85e9591, 0xc56770e7, 0x118d037c, 0xbf15ba0a, 0x6bffc991, + 0x56c62ce7, 0x822c5f7c, 0x0af75f0a, 0xde1d2c91, 0xe324c9e7, + 0x37ceba7c, 0x9956030a, 0x4dbc7091, 0x708595e7, 0xa46fe67c, + 0xf83e7109, 0x2cd40292, 0x11ede7e4, 0xc507947f, 0x6b9f2d09, + 0xbf755e92, 0x824cbbe4, 0x56a6c87f, 0xde7dc809, 0x0a97bb92, + 0x37ae5ee4, 0xe3442d7f, 0x4ddc9409, 0x9936e792, 0xa40f02e4, + 0x70e5717f, 0xb4b80308, 0x60527093, 0x5d6b95e5, 0x8981e67e, + 0x27195f08, 0xf3f32c93, 0xcecac9e5, 0x1a20ba7e, 0x92fbba08, + 0x4611c993, 0x7b282ce5, 0xafc25f7e, 0x015ae608, 0xd5b09593, + 0xe88970e5, 0x3c63037e, 0x502b5e0e, 0x84c12d95, 0xb9f8c8e3, + 0x6d12bb78, 0xc38a020e, 0x17607195, 0x2a5994e3, 0xfeb3e778, + 0x7668e70e, 0xa2829495, 0x9fbb71e3, 0x4b510278, 0xe5c9bb0e, + 0x3123c895, 0x0c1a2de3, 0xd8f05e78, 0x1cad2c0f, 0xc8475f94, + 0xf57ebae2, 0x2194c979, 0x8f0c700f, 0x5be60394, 0x66dfe6e2, + 0xb2359579, 0x3aee950f, 0xee04e694, 0xd33d03e2, 0x07d77079, + 0xa94fc90f, 0x7da5ba94, 0x409c5fe2, 0x94762c79, 0xc827bb0c, + 0x1ccdc897, 0x21f42de1, 0xf51e5e7a, 0x5b86e70c, 0x8f6c9497, + 0xb25571e1, 0x66bf027a, 0xee64020c, 0x3a8e7197, 0x07b794e1, + 0xd35de77a, 0x7dc55e0c, 0xa92f2d97, 0x9416c8e1, 0x40fcbb7a, + 0x84a1c90d, 0x504bba96, 0x6d725fe0, 0xb9982c7b, 0x1700950d, + 0xc3eae696, 0xfed303e0, 0x2a39707b, 0xa2e2700d, 0x76080396, + 0x4b31e6e0, 0x9fdb957b, 0x31432c0d, 0xe5a95f96, 0xd890bae0, + 0x0c7ac97b}, + {0x00000000, 0x27652581, 0x0fcc3bd9, 0x28a91e58, 0x5f9e0669, + 0x78fb23e8, 0x50523db0, 0x77371831, 0xbe3c0dd2, 0x99592853, + 0xb1f0360b, 0x9695138a, 0xe1a20bbb, 0xc6c72e3a, 0xee6e3062, + 0xc90b15e3, 0x3d7f6b7f, 0x1a1a4efe, 0x32b350a6, 0x15d67527, + 0x62e16d16, 0x45844897, 0x6d2d56cf, 0x4a48734e, 0x834366ad, + 0xa426432c, 0x8c8f5d74, 0xabea78f5, 0xdcdd60c4, 0xfbb84545, + 0xd3115b1d, 0xf4747e9c, 0x7afed6fe, 0x5d9bf37f, 0x7532ed27, + 0x5257c8a6, 0x2560d097, 0x0205f516, 0x2aaceb4e, 0x0dc9cecf, + 0xc4c2db2c, 0xe3a7fead, 0xcb0ee0f5, 0xec6bc574, 0x9b5cdd45, + 0xbc39f8c4, 0x9490e69c, 0xb3f5c31d, 0x4781bd81, 0x60e49800, + 0x484d8658, 0x6f28a3d9, 0x181fbbe8, 0x3f7a9e69, 0x17d38031, + 0x30b6a5b0, 0xf9bdb053, 0xded895d2, 0xf6718b8a, 0xd114ae0b, + 0xa623b63a, 0x814693bb, 0xa9ef8de3, 0x8e8aa862, 0xb5fadc26, + 0x929ff9a7, 0xba36e7ff, 0x9d53c27e, 0xea64da4f, 0xcd01ffce, + 0xe5a8e196, 0xc2cdc417, 0x0bc6d1f4, 0x2ca3f475, 0x040aea2d, + 0x236fcfac, 0x5458d79d, 0x733df21c, 0x5b94ec44, 0x7cf1c9c5, + 0x8885b759, 0xafe092d8, 0x87498c80, 0xa02ca901, 0xd71bb130, + 0xf07e94b1, 0xd8d78ae9, 0xffb2af68, 0x36b9ba8b, 0x11dc9f0a, + 0x39758152, 0x1e10a4d3, 0x6927bce2, 0x4e429963, 0x66eb873b, + 0x418ea2ba, 0xcf040ad8, 0xe8612f59, 0xc0c83101, 0xe7ad1480, + 0x909a0cb1, 0xb7ff2930, 0x9f563768, 0xb83312e9, 0x7138070a, + 0x565d228b, 0x7ef43cd3, 0x59911952, 0x2ea60163, 0x09c324e2, + 0x216a3aba, 0x060f1f3b, 0xf27b61a7, 0xd51e4426, 0xfdb75a7e, + 0xdad27fff, 0xade567ce, 0x8a80424f, 0xa2295c17, 0x854c7996, + 0x4c476c75, 0x6b2249f4, 0x438b57ac, 0x64ee722d, 0x13d96a1c, + 0x34bc4f9d, 0x1c1551c5, 0x3b707444, 0x6af5b94d, 0x4d909ccc, + 0x65398294, 0x425ca715, 0x356bbf24, 0x120e9aa5, 0x3aa784fd, + 0x1dc2a17c, 0xd4c9b49f, 0xf3ac911e, 0xdb058f46, 0xfc60aac7, + 0x8b57b2f6, 0xac329777, 0x849b892f, 0xa3feacae, 0x578ad232, + 0x70eff7b3, 0x5846e9eb, 0x7f23cc6a, 0x0814d45b, 0x2f71f1da, + 0x07d8ef82, 0x20bdca03, 0xe9b6dfe0, 0xced3fa61, 0xe67ae439, + 0xc11fc1b8, 0xb628d989, 0x914dfc08, 0xb9e4e250, 0x9e81c7d1, + 0x100b6fb3, 0x376e4a32, 0x1fc7546a, 0x38a271eb, 0x4f9569da, + 0x68f04c5b, 0x40595203, 0x673c7782, 0xae376261, 0x895247e0, + 0xa1fb59b8, 0x869e7c39, 0xf1a96408, 0xd6cc4189, 0xfe655fd1, + 0xd9007a50, 0x2d7404cc, 0x0a11214d, 0x22b83f15, 0x05dd1a94, + 0x72ea02a5, 0x558f2724, 0x7d26397c, 0x5a431cfd, 0x9348091e, + 0xb42d2c9f, 0x9c8432c7, 0xbbe11746, 0xccd60f77, 0xebb32af6, + 0xc31a34ae, 0xe47f112f, 0xdf0f656b, 0xf86a40ea, 0xd0c35eb2, + 0xf7a67b33, 0x80916302, 0xa7f44683, 0x8f5d58db, 0xa8387d5a, + 0x613368b9, 0x46564d38, 0x6eff5360, 0x499a76e1, 0x3ead6ed0, + 0x19c84b51, 0x31615509, 0x16047088, 0xe2700e14, 0xc5152b95, + 0xedbc35cd, 0xcad9104c, 0xbdee087d, 0x9a8b2dfc, 0xb22233a4, + 0x95471625, 0x5c4c03c6, 0x7b292647, 0x5380381f, 0x74e51d9e, + 0x03d205af, 0x24b7202e, 0x0c1e3e76, 0x2b7b1bf7, 0xa5f1b395, + 0x82949614, 0xaa3d884c, 0x8d58adcd, 0xfa6fb5fc, 0xdd0a907d, + 0xf5a38e25, 0xd2c6aba4, 0x1bcdbe47, 0x3ca89bc6, 0x1401859e, + 0x3364a01f, 0x4453b82e, 0x63369daf, 0x4b9f83f7, 0x6cfaa676, + 0x988ed8ea, 0xbfebfd6b, 0x9742e333, 0xb027c6b2, 0xc710de83, + 0xe075fb02, 0xc8dce55a, 0xefb9c0db, 0x26b2d538, 0x01d7f0b9, + 0x297eeee1, 0x0e1bcb60, 0x792cd351, 0x5e49f6d0, 0x76e0e888, + 0x5185cd09}}; + +#endif + +#endif + +#endif + +local const z_crc_t FAR x2n_table[] = { + 0x40000000, 0x20000000, 0x08000000, 0x00800000, 0x00008000, + 0xedb88320, 0xb1e6b092, 0xa06a2517, 0xed627dae, 0x88d14467, + 0xd7bbfe6a, 0xec447f11, 0x8e7ea170, 0x6427800e, 0x4d47bae0, + 0x09fe548f, 0x83852d0f, 0x30362f1a, 0x7b5a9cc3, 0x31fec169, + 0x9fec022a, 0x6c8dedc4, 0x15d6874d, 0x5fde7a4e, 0xbad90e37, + 0x2e4e5eef, 0x4eaba214, 0xa8a472c0, 0x429a969e, 0x148d302a, + 0xc40ba6d0, 0xc4e22c3c}; diff --git a/zlib/deflate.c b/zlib/deflate.c index 586cd1556b87..012ea8148e8d 100644 --- a/zlib/deflate.c +++ b/zlib/deflate.c @@ -1,5 +1,5 @@ /* deflate.c -- compress data using the deflation algorithm - * Copyright (C) 1995-2017 Jean-loup Gailly and Mark Adler + * Copyright (C) 1995-2024 Jean-loup Gailly and Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -47,12 +47,12 @@ * */ -/* @(#) $Id: deflate.c,v 1.1.1.2 2002/03/11 21:53:23 tromey Exp $ */ +/* @(#) $Id$ */ #include "deflate.h" const char deflate_copyright[] = - " deflate 1.2.11 Copyright 1995-2017 Jean-loup Gailly and Mark Adler "; + " deflate 1.3.1 Copyright 1995-2024 Jean-loup Gailly and Mark Adler "; /* If you use the zlib library in a product, an acknowledgment is welcome in the documentation of your product. If for some reason you cannot @@ -60,9 +60,6 @@ const char deflate_copyright[] = copyright string in the executable of your product. */ -/* =========================================================================== - * Function prototypes. - */ typedef enum { need_more, /* block not completed, need more input or more output */ block_done, /* block flush performed */ @@ -70,35 +67,16 @@ typedef enum { finish_done /* finish done, accept no more input or output */ } block_state; -typedef block_state (*compress_func) OF((deflate_state *s, int flush)); +typedef block_state (*compress_func)(deflate_state *s, int flush); /* Compression function. Returns the block state after the call. */ -local int deflateStateCheck OF((z_streamp strm)); -local void slide_hash OF((deflate_state *s)); -local void fill_window OF((deflate_state *s)); -local block_state deflate_stored OF((deflate_state *s, int flush)); -local block_state deflate_fast OF((deflate_state *s, int flush)); +local block_state deflate_stored(deflate_state *s, int flush); +local block_state deflate_fast(deflate_state *s, int flush); #ifndef FASTEST -local block_state deflate_slow OF((deflate_state *s, int flush)); -#endif -local block_state deflate_rle OF((deflate_state *s, int flush)); -local block_state deflate_huff OF((deflate_state *s, int flush)); -local void lm_init OF((deflate_state *s)); -local void putShortMSB OF((deflate_state *s, uInt b)); -local void flush_pending OF((z_streamp strm)); -local unsigned read_buf OF((z_streamp strm, Bytef *buf, unsigned size)); -#ifdef ASMV -# pragma message("Assembler code may have bugs -- use at your own risk") - void match_init OF((void)); /* asm code initialization */ - uInt longest_match OF((deflate_state *s, IPos cur_match)); -#else -local uInt longest_match OF((deflate_state *s, IPos cur_match)); -#endif - -#ifdef ZLIB_DEBUG -local void check_match OF((deflate_state *s, IPos start, IPos match, - int length)); +local block_state deflate_slow(deflate_state *s, int flush); #endif +local block_state deflate_rle(deflate_state *s, int flush); +local block_state deflate_huff(deflate_state *s, int flush); /* =========================================================================== * Local data @@ -160,7 +138,7 @@ local const config configuration_table[10] = { * characters, so that a running hash key can be computed from the previous * key instead of complete recalculation each time. */ -#define UPDATE_HASH(s,h,c) (h = (((h)<hash_shift) ^ (c)) & s->hash_mask) +#define UPDATE_HASH(s,h,c) (h = (((h) << s->hash_shift) ^ (c)) & s->hash_mask) /* =========================================================================== @@ -190,17 +168,23 @@ local const config configuration_table[10] = { * prev[] will be initialized on the fly. */ #define CLEAR_HASH(s) \ - s->head[s->hash_size-1] = NIL; \ - zmemzero((Bytef *)s->head, (unsigned)(s->hash_size-1)*sizeof(*s->head)); + do { \ + s->head[s->hash_size - 1] = NIL; \ + zmemzero((Bytef *)s->head, \ + (unsigned)(s->hash_size - 1)*sizeof(*s->head)); \ + } while (0) /* =========================================================================== * Slide the hash table when sliding the window down (could be avoided with 32 * bit values at the expense of memory usage). We slide even when level == 0 to * keep the hash table consistent if we switch back to level > 0 later. */ -local void slide_hash(s) - deflate_state *s; -{ +#if defined(__has_feature) +# if __has_feature(memory_sanitizer) + __attribute__((no_sanitize("memory"))) +# endif +#endif +local void slide_hash(deflate_state *s) { unsigned n, m; Posf *p; uInt wsize = s->w_size; @@ -224,39 +208,181 @@ local void slide_hash(s) #endif } +/* =========================================================================== + * Read a new buffer from the current input stream, update the adler32 + * and total number of bytes read. All deflate() input goes through + * this function so some applications may wish to modify it to avoid + * allocating a large strm->next_in buffer and copying from it. + * (See also flush_pending()). + */ +local unsigned read_buf(z_streamp strm, Bytef *buf, unsigned size) { + unsigned len = strm->avail_in; + + if (len > size) len = size; + if (len == 0) return 0; + + strm->avail_in -= len; + + zmemcpy(buf, strm->next_in, len); + if (strm->state->wrap == 1) { + strm->adler = adler32(strm->adler, buf, len); + } +#ifdef GZIP + else if (strm->state->wrap == 2) { + strm->adler = crc32(strm->adler, buf, len); + } +#endif + strm->next_in += len; + strm->total_in += len; + + return len; +} + +/* =========================================================================== + * Fill the window when the lookahead becomes insufficient. + * Updates strstart and lookahead. + * + * IN assertion: lookahead < MIN_LOOKAHEAD + * OUT assertions: strstart <= window_size-MIN_LOOKAHEAD + * At least one byte has been read, or avail_in == 0; reads are + * performed for at least two bytes (required for the zip translate_eol + * option -- not supported here). + */ +local void fill_window(deflate_state *s) { + unsigned n; + unsigned more; /* Amount of free space at the end of the window. */ + uInt wsize = s->w_size; + + Assert(s->lookahead < MIN_LOOKAHEAD, "already enough lookahead"); + + do { + more = (unsigned)(s->window_size -(ulg)s->lookahead -(ulg)s->strstart); + + /* Deal with !@#$% 64K limit: */ + if (sizeof(int) <= 2) { + if (more == 0 && s->strstart == 0 && s->lookahead == 0) { + more = wsize; + + } else if (more == (unsigned)(-1)) { + /* Very unlikely, but possible on 16 bit machine if + * strstart == 0 && lookahead == 1 (input done a byte at time) + */ + more--; + } + } + + /* If the window is almost full and there is insufficient lookahead, + * move the upper half to the lower one to make room in the upper half. + */ + if (s->strstart >= wsize + MAX_DIST(s)) { + + zmemcpy(s->window, s->window + wsize, (unsigned)wsize - more); + s->match_start -= wsize; + s->strstart -= wsize; /* we now have strstart >= MAX_DIST */ + s->block_start -= (long) wsize; + if (s->insert > s->strstart) + s->insert = s->strstart; + slide_hash(s); + more += wsize; + } + if (s->strm->avail_in == 0) break; + + /* If there was no sliding: + * strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 && + * more == window_size - lookahead - strstart + * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1) + * => more >= window_size - 2*WSIZE + 2 + * In the BIG_MEM or MMAP case (not yet supported), + * window_size == input_size + MIN_LOOKAHEAD && + * strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD. + * Otherwise, window_size == 2*WSIZE so more >= 2. + * If there was sliding, more >= WSIZE. So in all cases, more >= 2. + */ + Assert(more >= 2, "more < 2"); + + n = read_buf(s->strm, s->window + s->strstart + s->lookahead, more); + s->lookahead += n; + + /* Initialize the hash value now that we have some input: */ + if (s->lookahead + s->insert >= MIN_MATCH) { + uInt str = s->strstart - s->insert; + s->ins_h = s->window[str]; + UPDATE_HASH(s, s->ins_h, s->window[str + 1]); +#if MIN_MATCH != 3 + Call UPDATE_HASH() MIN_MATCH-3 more times +#endif + while (s->insert) { + UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); +#ifndef FASTEST + s->prev[str & s->w_mask] = s->head[s->ins_h]; +#endif + s->head[s->ins_h] = (Pos)str; + str++; + s->insert--; + if (s->lookahead + s->insert < MIN_MATCH) + break; + } + } + /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage, + * but this is not important since only literal bytes will be emitted. + */ + + } while (s->lookahead < MIN_LOOKAHEAD && s->strm->avail_in != 0); + + /* If the WIN_INIT bytes after the end of the current data have never been + * written, then zero those bytes in order to avoid memory check reports of + * the use of uninitialized (or uninitialised as Julian writes) bytes by + * the longest match routines. Update the high water mark for the next + * time through here. WIN_INIT is set to MAX_MATCH since the longest match + * routines allow scanning to strstart + MAX_MATCH, ignoring lookahead. + */ + if (s->high_water < s->window_size) { + ulg curr = s->strstart + (ulg)(s->lookahead); + ulg init; + + if (s->high_water < curr) { + /* Previous high water mark below current data -- zero WIN_INIT + * bytes or up to end of window, whichever is less. + */ + init = s->window_size - curr; + if (init > WIN_INIT) + init = WIN_INIT; + zmemzero(s->window + curr, (unsigned)init); + s->high_water = curr + init; + } + else if (s->high_water < (ulg)curr + WIN_INIT) { + /* High water mark at or above current data, but below current data + * plus WIN_INIT -- zero out to current data plus WIN_INIT, or up + * to end of window, whichever is less. + */ + init = (ulg)curr + WIN_INIT - s->high_water; + if (init > s->window_size - s->high_water) + init = s->window_size - s->high_water; + zmemzero(s->window + s->high_water, (unsigned)init); + s->high_water += init; + } + } + + Assert((ulg)s->strstart <= s->window_size - MIN_LOOKAHEAD, + "not enough room for search"); +} + /* ========================================================================= */ -int ZEXPORT deflateInit_(strm, level, version, stream_size) - z_streamp strm; - int level; - const char *version; - int stream_size; -{ +int ZEXPORT deflateInit_(z_streamp strm, int level, const char *version, + int stream_size) { return deflateInit2_(strm, level, Z_DEFLATED, MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, version, stream_size); /* To do: ignore strm->next_in if we use it as window */ } /* ========================================================================= */ -int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy, - version, stream_size) - z_streamp strm; - int level; - int method; - int windowBits; - int memLevel; - int strategy; - const char *version; - int stream_size; -{ +int ZEXPORT deflateInit2_(z_streamp strm, int level, int method, + int windowBits, int memLevel, int strategy, + const char *version, int stream_size) { deflate_state *s; int wrap = 1; static const char my_version[] = ZLIB_VERSION; - ushf *overlay; - /* We overlay pending_buf and d_buf+l_buf. This works since the average - * output size for (length,distance) codes is <= 24 bits. - */ - if (version == Z_NULL || version[0] != my_version[0] || stream_size != sizeof(z_stream)) { return Z_VERSION_ERROR; @@ -287,6 +413,8 @@ int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy, if (windowBits < 0) { /* suppress zlib wrapper */ wrap = 0; + if (windowBits < -15) + return Z_STREAM_ERROR; windowBits = -windowBits; } #ifdef GZIP @@ -316,7 +444,7 @@ int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy, s->hash_bits = (uInt)memLevel + 7; s->hash_size = 1 << s->hash_bits; s->hash_mask = s->hash_size - 1; - s->hash_shift = ((s->hash_bits+MIN_MATCH-1)/MIN_MATCH); + s->hash_shift = ((s->hash_bits + MIN_MATCH-1) / MIN_MATCH); s->window = (Bytef *) ZALLOC(strm, s->w_size, 2*sizeof(Byte)); s->prev = (Posf *) ZALLOC(strm, s->w_size, sizeof(Pos)); @@ -326,9 +454,47 @@ int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy, s->lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */ - overlay = (ushf *) ZALLOC(strm, s->lit_bufsize, sizeof(ush)+2); - s->pending_buf = (uchf *) overlay; - s->pending_buf_size = (ulg)s->lit_bufsize * (sizeof(ush)+2L); + /* We overlay pending_buf and sym_buf. This works since the average size + * for length/distance pairs over any compressed block is assured to be 31 + * bits or less. + * + * Analysis: The longest fixed codes are a length code of 8 bits plus 5 + * extra bits, for lengths 131 to 257. The longest fixed distance codes are + * 5 bits plus 13 extra bits, for distances 16385 to 32768. The longest + * possible fixed-codes length/distance pair is then 31 bits total. + * + * sym_buf starts one-fourth of the way into pending_buf. So there are + * three bytes in sym_buf for every four bytes in pending_buf. Each symbol + * in sym_buf is three bytes -- two for the distance and one for the + * literal/length. As each symbol is consumed, the pointer to the next + * sym_buf value to read moves forward three bytes. From that symbol, up to + * 31 bits are written to pending_buf. The closest the written pending_buf + * bits gets to the next sym_buf symbol to read is just before the last + * code is written. At that time, 31*(n - 2) bits have been written, just + * after 24*(n - 2) bits have been consumed from sym_buf. sym_buf starts at + * 8*n bits into pending_buf. (Note that the symbol buffer fills when n - 1 + * symbols are written.) The closest the writing gets to what is unread is + * then n + 14 bits. Here n is lit_bufsize, which is 16384 by default, and + * can range from 128 to 32768. + * + * Therefore, at a minimum, there are 142 bits of space between what is + * written and what is read in the overlain buffers, so the symbols cannot + * be overwritten by the compressed data. That space is actually 139 bits, + * due to the three-bit fixed-code block header. + * + * That covers the case where either Z_FIXED is specified, forcing fixed + * codes, or when the use of fixed codes is chosen, because that choice + * results in a smaller compressed block than dynamic codes. That latter + * condition then assures that the above analysis also covers all dynamic + * blocks. A dynamic-code block will only be chosen to be emitted if it has + * fewer bits than a fixed-code block would for the same set of symbols. + * Therefore its average symbol length is assured to be less than 31. So + * the compressed data for a dynamic block also cannot overwrite the + * symbols from which it is being constructed. + */ + + s->pending_buf = (uchf *) ZALLOC(strm, s->lit_bufsize, LIT_BUFS); + s->pending_buf_size = (ulg)s->lit_bufsize * 4; if (s->window == Z_NULL || s->prev == Z_NULL || s->head == Z_NULL || s->pending_buf == Z_NULL) { @@ -337,8 +503,18 @@ int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy, deflateEnd (strm); return Z_MEM_ERROR; } - s->d_buf = overlay + s->lit_bufsize/sizeof(ush); - s->l_buf = s->pending_buf + (1+sizeof(ush))*s->lit_bufsize; +#ifdef LIT_MEM + s->d_buf = (ushf *)(s->pending_buf + (s->lit_bufsize << 1)); + s->l_buf = s->pending_buf + (s->lit_bufsize << 2); + s->sym_end = s->lit_bufsize - 1; +#else + s->sym_buf = s->pending_buf + s->lit_bufsize; + s->sym_end = (s->lit_bufsize - 1) * 3; +#endif + /* We avoid equality with lit_bufsize*3 because of wraparound at 64K + * on 16 bit machines and because stored blocks are restricted to + * 64K-1 bytes. + */ s->level = level; s->strategy = strategy; @@ -350,9 +526,7 @@ int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy, /* ========================================================================= * Check for a valid deflate stream state. Return 0 if ok, 1 if not. */ -local int deflateStateCheck (strm) - z_streamp strm; -{ +local int deflateStateCheck(z_streamp strm) { deflate_state *s; if (strm == Z_NULL || strm->zalloc == (alloc_func)0 || strm->zfree == (free_func)0) @@ -373,11 +547,8 @@ local int deflateStateCheck (strm) } /* ========================================================================= */ -int ZEXPORT deflateSetDictionary (strm, dictionary, dictLength) - z_streamp strm; - const Bytef *dictionary; - uInt dictLength; -{ +int ZEXPORT deflateSetDictionary(z_streamp strm, const Bytef *dictionary, + uInt dictLength) { deflate_state *s; uInt str, n; int wrap; @@ -442,11 +613,8 @@ int ZEXPORT deflateSetDictionary (strm, dictionary, dictLength) } /* ========================================================================= */ -int ZEXPORT deflateGetDictionary (strm, dictionary, dictLength) - z_streamp strm; - Bytef *dictionary; - uInt *dictLength; -{ +int ZEXPORT deflateGetDictionary(z_streamp strm, Bytef *dictionary, + uInt *dictLength) { deflate_state *s; uInt len; @@ -464,9 +632,7 @@ int ZEXPORT deflateGetDictionary (strm, dictionary, dictLength) } /* ========================================================================= */ -int ZEXPORT deflateResetKeep (strm) - z_streamp strm; -{ +int ZEXPORT deflateResetKeep(z_streamp strm) { deflate_state *s; if (deflateStateCheck(strm)) { @@ -488,23 +654,45 @@ int ZEXPORT deflateResetKeep (strm) #ifdef GZIP s->wrap == 2 ? GZIP_STATE : #endif - s->wrap ? INIT_STATE : BUSY_STATE; + INIT_STATE; strm->adler = #ifdef GZIP s->wrap == 2 ? crc32(0L, Z_NULL, 0) : #endif adler32(0L, Z_NULL, 0); - s->last_flush = Z_NO_FLUSH; + s->last_flush = -2; _tr_init(s); return Z_OK; } +/* =========================================================================== + * Initialize the "longest match" routines for a new zlib stream + */ +local void lm_init(deflate_state *s) { + s->window_size = (ulg)2L*s->w_size; + + CLEAR_HASH(s); + + /* Set the default configuration parameters: + */ + s->max_lazy_match = configuration_table[s->level].max_lazy; + s->good_match = configuration_table[s->level].good_length; + s->nice_match = configuration_table[s->level].nice_length; + s->max_chain_length = configuration_table[s->level].max_chain; + + s->strstart = 0; + s->block_start = 0L; + s->lookahead = 0; + s->insert = 0; + s->match_length = s->prev_length = MIN_MATCH-1; + s->match_available = 0; + s->ins_h = 0; +} + /* ========================================================================= */ -int ZEXPORT deflateReset (strm) - z_streamp strm; -{ +int ZEXPORT deflateReset(z_streamp strm) { int ret; ret = deflateResetKeep(strm); @@ -514,10 +702,7 @@ int ZEXPORT deflateReset (strm) } /* ========================================================================= */ -int ZEXPORT deflateSetHeader (strm, head) - z_streamp strm; - gz_headerp head; -{ +int ZEXPORT deflateSetHeader(z_streamp strm, gz_headerp head) { if (deflateStateCheck(strm) || strm->state->wrap != 2) return Z_STREAM_ERROR; strm->state->gzhead = head; @@ -525,11 +710,7 @@ int ZEXPORT deflateSetHeader (strm, head) } /* ========================================================================= */ -int ZEXPORT deflatePending (strm, pending, bits) - unsigned *pending; - int *bits; - z_streamp strm; -{ +int ZEXPORT deflatePending(z_streamp strm, unsigned *pending, int *bits) { if (deflateStateCheck(strm)) return Z_STREAM_ERROR; if (pending != Z_NULL) *pending = strm->state->pending; @@ -539,18 +720,21 @@ int ZEXPORT deflatePending (strm, pending, bits) } /* ========================================================================= */ -int ZEXPORT deflatePrime (strm, bits, value) - z_streamp strm; - int bits; - int value; -{ +int ZEXPORT deflatePrime(z_streamp strm, int bits, int value) { deflate_state *s; int put; if (deflateStateCheck(strm)) return Z_STREAM_ERROR; s = strm->state; - if ((Bytef *)(s->d_buf) < s->pending_out + ((Buf_size + 7) >> 3)) +#ifdef LIT_MEM + if (bits < 0 || bits > 16 || + (uchf *)s->d_buf < s->pending_out + ((Buf_size + 7) >> 3)) + return Z_BUF_ERROR; +#else + if (bits < 0 || bits > 16 || + s->sym_buf < s->pending_out + ((Buf_size + 7) >> 3)) return Z_BUF_ERROR; +#endif do { put = Buf_size - s->bi_valid; if (put > bits) @@ -565,11 +749,7 @@ int ZEXPORT deflatePrime (strm, bits, value) } /* ========================================================================= */ -int ZEXPORT deflateParams(strm, level, strategy) - z_streamp strm; - int level; - int strategy; -{ +int ZEXPORT deflateParams(z_streamp strm, int level, int strategy) { deflate_state *s; compress_func func; @@ -587,12 +767,12 @@ int ZEXPORT deflateParams(strm, level, strategy) func = configuration_table[s->level].func; if ((strategy != s->strategy || func != configuration_table[level].func) && - s->high_water) { + s->last_flush != -2) { /* Flush the last buffer: */ int err = deflate(strm, Z_BLOCK); if (err == Z_STREAM_ERROR) return err; - if (strm->avail_out == 0) + if (strm->avail_in || (s->strstart - s->block_start) + s->lookahead) return Z_BUF_ERROR; } if (s->level != level) { @@ -614,13 +794,8 @@ int ZEXPORT deflateParams(strm, level, strategy) } /* ========================================================================= */ -int ZEXPORT deflateTune(strm, good_length, max_lazy, nice_length, max_chain) - z_streamp strm; - int good_length; - int max_lazy; - int nice_length; - int max_chain; -{ +int ZEXPORT deflateTune(z_streamp strm, int good_length, int max_lazy, + int nice_length, int max_chain) { deflate_state *s; if (deflateStateCheck(strm)) return Z_STREAM_ERROR; @@ -633,36 +808,47 @@ int ZEXPORT deflateTune(strm, good_length, max_lazy, nice_length, max_chain) } /* ========================================================================= - * For the default windowBits of 15 and memLevel of 8, this function returns - * a close to exact, as well as small, upper bound on the compressed size. - * They are coded as constants here for a reason--if the #define's are - * changed, then this function needs to be changed as well. The return - * value for 15 and 8 only works for those exact settings. + * For the default windowBits of 15 and memLevel of 8, this function returns a + * close to exact, as well as small, upper bound on the compressed size. This + * is an expansion of ~0.03%, plus a small constant. + * + * For any setting other than those defaults for windowBits and memLevel, one + * of two worst case bounds is returned. This is at most an expansion of ~4% or + * ~13%, plus a small constant. + * + * Both the 0.03% and 4% derive from the overhead of stored blocks. The first + * one is for stored blocks of 16383 bytes (memLevel == 8), whereas the second + * is for stored blocks of 127 bytes (the worst case memLevel == 1). The + * expansion results from five bytes of header for each stored block. * - * For any setting other than those defaults for windowBits and memLevel, - * the value returned is a conservative worst case for the maximum expansion - * resulting from using fixed blocks instead of stored blocks, which deflate - * can emit on compressed data for some combinations of the parameters. + * The larger expansion of 13% results from a window size less than or equal to + * the symbols buffer size (windowBits <= memLevel + 7). In that case some of + * the data being compressed may have slid out of the sliding window, impeding + * a stored block from being emitted. Then the only choice is a fixed or + * dynamic block, where a fixed block limits the maximum expansion to 9 bits + * per 8-bit byte, plus 10 bits for every block. The smallest block size for + * which this can occur is 255 (memLevel == 2). * - * This function could be more sophisticated to provide closer upper bounds for - * every combination of windowBits and memLevel. But even the conservative - * upper bound of about 14% expansion does not seem onerous for output buffer - * allocation. + * Shifts are used to approximate divisions, for speed. */ -uLong ZEXPORT deflateBound(strm, sourceLen) - z_streamp strm; - uLong sourceLen; -{ +uLong ZEXPORT deflateBound(z_streamp strm, uLong sourceLen) { deflate_state *s; - uLong complen, wraplen; + uLong fixedlen, storelen, wraplen; - /* conservative upper bound for compressed data */ - complen = sourceLen + - ((sourceLen + 7) >> 3) + ((sourceLen + 63) >> 6) + 5; + /* upper bound for fixed blocks with 9-bit literals and length 255 + (memLevel == 2, which is the lowest that may not use stored blocks) -- + ~13% overhead plus a small constant */ + fixedlen = sourceLen + (sourceLen >> 3) + (sourceLen >> 8) + + (sourceLen >> 9) + 4; - /* if can't get parameters, return conservative bound plus zlib wrapper */ + /* upper bound for stored blocks with length 127 (memLevel == 1) -- + ~4% overhead plus a small constant */ + storelen = sourceLen + (sourceLen >> 5) + (sourceLen >> 7) + + (sourceLen >> 11) + 7; + + /* if can't get parameters, return larger bound plus a zlib wrapper */ if (deflateStateCheck(strm)) - return complen + 6; + return (fixedlen > storelen ? fixedlen : storelen) + 6; /* compute wrapper length */ s = strm->state; @@ -699,11 +885,13 @@ uLong ZEXPORT deflateBound(strm, sourceLen) wraplen = 6; } - /* if not default parameters, return conservative bound */ + /* if not default parameters, return one of the conservative bounds */ if (s->w_bits != 15 || s->hash_bits != 8 + 7) - return complen + wraplen; + return (s->w_bits <= s->hash_bits && s->level ? fixedlen : storelen) + + wraplen; - /* default settings: return tight bound for that case */ + /* default settings: return tight bound for that case -- ~0.03% overhead + plus a small constant */ return sourceLen + (sourceLen >> 12) + (sourceLen >> 14) + (sourceLen >> 25) + 13 - 6 + wraplen; } @@ -713,10 +901,7 @@ uLong ZEXPORT deflateBound(strm, sourceLen) * IN assertion: the stream state is correct and there is enough room in * pending_buf. */ -local void putShortMSB (s, b) - deflate_state *s; - uInt b; -{ +local void putShortMSB(deflate_state *s, uInt b) { put_byte(s, (Byte)(b >> 8)); put_byte(s, (Byte)(b & 0xff)); } @@ -727,9 +912,7 @@ local void putShortMSB (s, b) * applications may wish to modify it to avoid allocating a large * strm->next_out buffer and copying into it. (See also read_buf()). */ -local void flush_pending(strm) - z_streamp strm; -{ +local void flush_pending(z_streamp strm) { unsigned len; deflate_state *s = strm->state; @@ -760,10 +943,7 @@ local void flush_pending(strm) } while (0) /* ========================================================================= */ -int ZEXPORT deflate (strm, flush) - z_streamp strm; - int flush; -{ +int ZEXPORT deflate(z_streamp strm, int flush) { int old_flush; /* value of flush param for previous deflate call */ deflate_state *s; @@ -811,9 +991,11 @@ int ZEXPORT deflate (strm, flush) } /* Write the header */ + if (s->status == INIT_STATE && s->wrap == 0) + s->status = BUSY_STATE; if (s->status == INIT_STATE) { /* zlib header */ - uInt header = (Z_DEFLATED + ((s->w_bits-8)<<4)) << 8; + uInt header = (Z_DEFLATED + ((s->w_bits - 8) << 4)) << 8; uInt level_flags; if (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2) @@ -1073,9 +1255,7 @@ int ZEXPORT deflate (strm, flush) } /* ========================================================================= */ -int ZEXPORT deflateEnd (strm) - z_streamp strm; -{ +int ZEXPORT deflateEnd(z_streamp strm) { int status; if (deflateStateCheck(strm)) return Z_STREAM_ERROR; @@ -1099,16 +1279,14 @@ int ZEXPORT deflateEnd (strm) * To simplify the source, this is not supported for 16-bit MSDOS (which * doesn't have enough memory anyway to duplicate compression states). */ -int ZEXPORT deflateCopy (dest, source) - z_streamp dest; - z_streamp source; -{ +int ZEXPORT deflateCopy(z_streamp dest, z_streamp source) { #ifdef MAXSEG_64K + (void)dest; + (void)source; return Z_STREAM_ERROR; #else deflate_state *ds; deflate_state *ss; - ushf *overlay; if (deflateStateCheck(source) || dest == Z_NULL) { @@ -1128,8 +1306,7 @@ int ZEXPORT deflateCopy (dest, source) ds->window = (Bytef *) ZALLOC(dest, ds->w_size, 2*sizeof(Byte)); ds->prev = (Posf *) ZALLOC(dest, ds->w_size, sizeof(Pos)); ds->head = (Posf *) ZALLOC(dest, ds->hash_size, sizeof(Pos)); - overlay = (ushf *) ZALLOC(dest, ds->lit_bufsize, sizeof(ush)+2); - ds->pending_buf = (uchf *) overlay; + ds->pending_buf = (uchf *) ZALLOC(dest, ds->lit_bufsize, LIT_BUFS); if (ds->window == Z_NULL || ds->prev == Z_NULL || ds->head == Z_NULL || ds->pending_buf == Z_NULL) { @@ -1140,11 +1317,15 @@ int ZEXPORT deflateCopy (dest, source) zmemcpy(ds->window, ss->window, ds->w_size * 2 * sizeof(Byte)); zmemcpy((voidpf)ds->prev, (voidpf)ss->prev, ds->w_size * sizeof(Pos)); zmemcpy((voidpf)ds->head, (voidpf)ss->head, ds->hash_size * sizeof(Pos)); - zmemcpy(ds->pending_buf, ss->pending_buf, (uInt)ds->pending_buf_size); + zmemcpy(ds->pending_buf, ss->pending_buf, ds->lit_bufsize * LIT_BUFS); ds->pending_out = ds->pending_buf + (ss->pending_out - ss->pending_buf); - ds->d_buf = overlay + ds->lit_bufsize/sizeof(ush); - ds->l_buf = ds->pending_buf + (1+sizeof(ush))*ds->lit_bufsize; +#ifdef LIT_MEM + ds->d_buf = (ushf *)(ds->pending_buf + (ds->lit_bufsize << 1)); + ds->l_buf = ds->pending_buf + (ds->lit_bufsize << 2); +#else + ds->sym_buf = ds->pending_buf + ds->lit_bufsize; +#endif ds->l_desc.dyn_tree = ds->dyn_ltree; ds->d_desc.dyn_tree = ds->dyn_dtree; @@ -1154,71 +1335,6 @@ int ZEXPORT deflateCopy (dest, source) #endif /* MAXSEG_64K */ } -/* =========================================================================== - * Read a new buffer from the current input stream, update the adler32 - * and total number of bytes read. All deflate() input goes through - * this function so some applications may wish to modify it to avoid - * allocating a large strm->next_in buffer and copying from it. - * (See also flush_pending()). - */ -local unsigned read_buf(strm, buf, size) - z_streamp strm; - Bytef *buf; - unsigned size; -{ - unsigned len = strm->avail_in; - - if (len > size) len = size; - if (len == 0) return 0; - - strm->avail_in -= len; - - zmemcpy(buf, strm->next_in, len); - if (strm->state->wrap == 1) { - strm->adler = adler32(strm->adler, buf, len); - } -#ifdef GZIP - else if (strm->state->wrap == 2) { - strm->adler = crc32(strm->adler, buf, len); - } -#endif - strm->next_in += len; - strm->total_in += len; - - return len; -} - -/* =========================================================================== - * Initialize the "longest match" routines for a new zlib stream - */ -local void lm_init (s) - deflate_state *s; -{ - s->window_size = (ulg)2L*s->w_size; - - CLEAR_HASH(s); - - /* Set the default configuration parameters: - */ - s->max_lazy_match = configuration_table[s->level].max_lazy; - s->good_match = configuration_table[s->level].good_length; - s->nice_match = configuration_table[s->level].nice_length; - s->max_chain_length = configuration_table[s->level].max_chain; - - s->strstart = 0; - s->block_start = 0L; - s->lookahead = 0; - s->insert = 0; - s->match_length = s->prev_length = MIN_MATCH-1; - s->match_available = 0; - s->ins_h = 0; -#ifndef FASTEST -#ifdef ASMV - match_init(); /* initialize the asm code */ -#endif -#endif -} - #ifndef FASTEST /* =========================================================================== * Set match_start to the longest match starting at the given string and @@ -1229,14 +1345,7 @@ local void lm_init (s) * string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1 * OUT assertion: the match length is not greater than s->lookahead. */ -#ifndef ASMV -/* For 80x86 and 680x0, an optimized version will be provided in match.asm or - * match.S. The code will be functionally equivalent. - */ -local uInt longest_match(s, cur_match) - deflate_state *s; - IPos cur_match; /* current match */ -{ +local uInt longest_match(deflate_state *s, IPos cur_match) { unsigned chain_length = s->max_chain_length;/* max hash chain length */ register Bytef *scan = s->window + s->strstart; /* current string */ register Bytef *match; /* matched string */ @@ -1257,10 +1366,10 @@ local uInt longest_match(s, cur_match) */ register Bytef *strend = s->window + s->strstart + MAX_MATCH - 1; register ush scan_start = *(ushf*)scan; - register ush scan_end = *(ushf*)(scan+best_len-1); + register ush scan_end = *(ushf*)(scan + best_len - 1); #else register Bytef *strend = s->window + s->strstart + MAX_MATCH; - register Byte scan_end1 = scan[best_len-1]; + register Byte scan_end1 = scan[best_len - 1]; register Byte scan_end = scan[best_len]; #endif @@ -1278,7 +1387,8 @@ local uInt longest_match(s, cur_match) */ if ((uInt)nice_match > s->lookahead) nice_match = (int)s->lookahead; - Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead"); + Assert((ulg)s->strstart <= s->window_size - MIN_LOOKAHEAD, + "need lookahead"); do { Assert(cur_match < s->strstart, "no future"); @@ -1296,43 +1406,44 @@ local uInt longest_match(s, cur_match) /* This code assumes sizeof(unsigned short) == 2. Do not use * UNALIGNED_OK if your compiler uses a different size. */ - if (*(ushf*)(match+best_len-1) != scan_end || + if (*(ushf*)(match + best_len - 1) != scan_end || *(ushf*)match != scan_start) continue; /* It is not necessary to compare scan[2] and match[2] since they are * always equal when the other bytes match, given that the hash keys * are equal and that HASH_BITS >= 8. Compare 2 bytes at a time at - * strstart+3, +5, ... up to strstart+257. We check for insufficient + * strstart + 3, + 5, up to strstart + 257. We check for insufficient * lookahead only every 4th comparison; the 128th check will be made - * at strstart+257. If MAX_MATCH-2 is not a multiple of 8, it is + * at strstart + 257. If MAX_MATCH-2 is not a multiple of 8, it is * necessary to put more guard bytes at the end of the window, or * to check more often for insufficient lookahead. */ Assert(scan[2] == match[2], "scan[2]?"); scan++, match++; do { - } while (*(ushf*)(scan+=2) == *(ushf*)(match+=2) && - *(ushf*)(scan+=2) == *(ushf*)(match+=2) && - *(ushf*)(scan+=2) == *(ushf*)(match+=2) && - *(ushf*)(scan+=2) == *(ushf*)(match+=2) && + } while (*(ushf*)(scan += 2) == *(ushf*)(match += 2) && + *(ushf*)(scan += 2) == *(ushf*)(match += 2) && + *(ushf*)(scan += 2) == *(ushf*)(match += 2) && + *(ushf*)(scan += 2) == *(ushf*)(match += 2) && scan < strend); /* The funny "do {}" generates better code on most compilers */ - /* Here, scan <= window+strstart+257 */ - Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); + /* Here, scan <= window + strstart + 257 */ + Assert(scan <= s->window + (unsigned)(s->window_size - 1), + "wild scan"); if (*scan == *match) scan++; - len = (MAX_MATCH - 1) - (int)(strend-scan); + len = (MAX_MATCH - 1) - (int)(strend - scan); scan = strend - (MAX_MATCH-1); #else /* UNALIGNED_OK */ - if (match[best_len] != scan_end || - match[best_len-1] != scan_end1 || - *match != *scan || - *++match != scan[1]) continue; + if (match[best_len] != scan_end || + match[best_len - 1] != scan_end1 || + *match != *scan || + *++match != scan[1]) continue; - /* The check at best_len-1 can be removed because it will be made + /* The check at best_len - 1 can be removed because it will be made * again later. (This heuristic is not always a win.) * It is not necessary to compare scan[2] and match[2] since they * are always equal when the other bytes match, given that @@ -1342,7 +1453,7 @@ local uInt longest_match(s, cur_match) Assert(*scan == *match, "match[2]?"); /* We check for insufficient lookahead only every 8th comparison; - * the 256th check will be made at strstart+258. + * the 256th check will be made at strstart + 258. */ do { } while (*++scan == *++match && *++scan == *++match && @@ -1351,7 +1462,8 @@ local uInt longest_match(s, cur_match) *++scan == *++match && *++scan == *++match && scan < strend); - Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); + Assert(scan <= s->window + (unsigned)(s->window_size - 1), + "wild scan"); len = MAX_MATCH - (int)(strend - scan); scan = strend - MAX_MATCH; @@ -1363,9 +1475,9 @@ local uInt longest_match(s, cur_match) best_len = len; if (len >= nice_match) break; #ifdef UNALIGNED_OK - scan_end = *(ushf*)(scan+best_len-1); + scan_end = *(ushf*)(scan + best_len - 1); #else - scan_end1 = scan[best_len-1]; + scan_end1 = scan[best_len - 1]; scan_end = scan[best_len]; #endif } @@ -1375,17 +1487,13 @@ local uInt longest_match(s, cur_match) if ((uInt)best_len <= s->lookahead) return (uInt)best_len; return s->lookahead; } -#endif /* ASMV */ #else /* FASTEST */ /* --------------------------------------------------------------------------- * Optimized version for FASTEST only */ -local uInt longest_match(s, cur_match) - deflate_state *s; - IPos cur_match; /* current match */ -{ +local uInt longest_match(deflate_state *s, IPos cur_match) { register Bytef *scan = s->window + s->strstart; /* current string */ register Bytef *match; /* matched string */ register int len; /* length of current match */ @@ -1396,7 +1504,8 @@ local uInt longest_match(s, cur_match) */ Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever"); - Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead"); + Assert((ulg)s->strstart <= s->window_size - MIN_LOOKAHEAD, + "need lookahead"); Assert(cur_match < s->strstart, "no future"); @@ -1406,7 +1515,7 @@ local uInt longest_match(s, cur_match) */ if (match[0] != scan[0] || match[1] != scan[1]) return MIN_MATCH-1; - /* The check at best_len-1 can be removed because it will be made + /* The check at best_len - 1 can be removed because it will be made * again later. (This heuristic is not always a win.) * It is not necessary to compare scan[2] and match[2] since they * are always equal when the other bytes match, given that @@ -1416,7 +1525,7 @@ local uInt longest_match(s, cur_match) Assert(*scan == *match, "match[2]?"); /* We check for insufficient lookahead only every 8th comparison; - * the 256th check will be made at strstart+258. + * the 256th check will be made at strstart + 258. */ do { } while (*++scan == *++match && *++scan == *++match && @@ -1425,7 +1534,7 @@ local uInt longest_match(s, cur_match) *++scan == *++match && *++scan == *++match && scan < strend); - Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); + Assert(scan <= s->window + (unsigned)(s->window_size - 1), "wild scan"); len = MAX_MATCH - (int)(strend - scan); @@ -1445,23 +1554,27 @@ local uInt longest_match(s, cur_match) /* =========================================================================== * Check that the match at match_start is indeed a match. */ -local void check_match(s, start, match, length) - deflate_state *s; - IPos start, match; - int length; -{ +local void check_match(deflate_state *s, IPos start, IPos match, int length) { /* check that the match is indeed a match */ - if (zmemcmp(s->window + match, - s->window + start, length) != EQUAL) { - fprintf(stderr, " start %u, match %u, length %d\n", - start, match, length); + Bytef *back = s->window + (int)match, *here = s->window + start; + IPos len = length; + if (match == (IPos)-1) { + /* match starts one byte before the current window -- just compare the + subsequent length-1 bytes */ + back++; + here++; + len--; + } + if (zmemcmp(back, here, len) != EQUAL) { + fprintf(stderr, " start %u, match %d, length %d\n", + start, (int)match, length); do { - fprintf(stderr, "%c%c", s->window[match++], s->window[start++]); - } while (--length != 0); + fprintf(stderr, "(%02x %02x)", *back++, *here++); + } while (--len != 0); z_error("invalid match"); } if (z_verbose > 1) { - fprintf(stderr,"\\[%d,%d]", start-match, length); + fprintf(stderr,"\\[%d,%d]", start - match, length); do { putc(s->window[start++], stderr); } while (--length != 0); } } @@ -1469,135 +1582,6 @@ local void check_match(s, start, match, length) # define check_match(s, start, match, length) #endif /* ZLIB_DEBUG */ -/* =========================================================================== - * Fill the window when the lookahead becomes insufficient. - * Updates strstart and lookahead. - * - * IN assertion: lookahead < MIN_LOOKAHEAD - * OUT assertions: strstart <= window_size-MIN_LOOKAHEAD - * At least one byte has been read, or avail_in == 0; reads are - * performed for at least two bytes (required for the zip translate_eol - * option -- not supported here). - */ -local void fill_window(s) - deflate_state *s; -{ - unsigned n; - unsigned more; /* Amount of free space at the end of the window. */ - uInt wsize = s->w_size; - - Assert(s->lookahead < MIN_LOOKAHEAD, "already enough lookahead"); - - do { - more = (unsigned)(s->window_size -(ulg)s->lookahead -(ulg)s->strstart); - - /* Deal with !@#$% 64K limit: */ - if (sizeof(int) <= 2) { - if (more == 0 && s->strstart == 0 && s->lookahead == 0) { - more = wsize; - - } else if (more == (unsigned)(-1)) { - /* Very unlikely, but possible on 16 bit machine if - * strstart == 0 && lookahead == 1 (input done a byte at time) - */ - more--; - } - } - - /* If the window is almost full and there is insufficient lookahead, - * move the upper half to the lower one to make room in the upper half. - */ - if (s->strstart >= wsize+MAX_DIST(s)) { - - zmemcpy(s->window, s->window+wsize, (unsigned)wsize - more); - s->match_start -= wsize; - s->strstart -= wsize; /* we now have strstart >= MAX_DIST */ - s->block_start -= (long) wsize; - slide_hash(s); - more += wsize; - } - if (s->strm->avail_in == 0) break; - - /* If there was no sliding: - * strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 && - * more == window_size - lookahead - strstart - * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1) - * => more >= window_size - 2*WSIZE + 2 - * In the BIG_MEM or MMAP case (not yet supported), - * window_size == input_size + MIN_LOOKAHEAD && - * strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD. - * Otherwise, window_size == 2*WSIZE so more >= 2. - * If there was sliding, more >= WSIZE. So in all cases, more >= 2. - */ - Assert(more >= 2, "more < 2"); - - n = read_buf(s->strm, s->window + s->strstart + s->lookahead, more); - s->lookahead += n; - - /* Initialize the hash value now that we have some input: */ - if (s->lookahead + s->insert >= MIN_MATCH) { - uInt str = s->strstart - s->insert; - s->ins_h = s->window[str]; - UPDATE_HASH(s, s->ins_h, s->window[str + 1]); -#if MIN_MATCH != 3 - Call UPDATE_HASH() MIN_MATCH-3 more times -#endif - while (s->insert) { - UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); -#ifndef FASTEST - s->prev[str & s->w_mask] = s->head[s->ins_h]; -#endif - s->head[s->ins_h] = (Pos)str; - str++; - s->insert--; - if (s->lookahead + s->insert < MIN_MATCH) - break; - } - } - /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage, - * but this is not important since only literal bytes will be emitted. - */ - - } while (s->lookahead < MIN_LOOKAHEAD && s->strm->avail_in != 0); - - /* If the WIN_INIT bytes after the end of the current data have never been - * written, then zero those bytes in order to avoid memory check reports of - * the use of uninitialized (or uninitialised as Julian writes) bytes by - * the longest match routines. Update the high water mark for the next - * time through here. WIN_INIT is set to MAX_MATCH since the longest match - * routines allow scanning to strstart + MAX_MATCH, ignoring lookahead. - */ - if (s->high_water < s->window_size) { - ulg curr = s->strstart + (ulg)(s->lookahead); - ulg init; - - if (s->high_water < curr) { - /* Previous high water mark below current data -- zero WIN_INIT - * bytes or up to end of window, whichever is less. - */ - init = s->window_size - curr; - if (init > WIN_INIT) - init = WIN_INIT; - zmemzero(s->window + curr, (unsigned)init); - s->high_water = curr + init; - } - else if (s->high_water < (ulg)curr + WIN_INIT) { - /* High water mark at or above current data, but below current data - * plus WIN_INIT -- zero out to current data plus WIN_INIT, or up - * to end of window, whichever is less. - */ - init = (ulg)curr + WIN_INIT - s->high_water; - if (init > s->window_size - s->high_water) - init = s->window_size - s->high_water; - zmemzero(s->window + s->high_water, (unsigned)init); - s->high_water += init; - } - } - - Assert((ulg)s->strstart <= s->window_size - MIN_LOOKAHEAD, - "not enough room for search"); -} - /* =========================================================================== * Flush the current block, with given end-of-file flag. * IN assertion: strstart is set to the end of the current match. @@ -1638,12 +1622,9 @@ local void fill_window(s) * * deflate_stored() is written to minimize the number of times an input byte is * copied. It is most efficient with large input and output buffers, which - * maximizes the opportunites to have a single copy from next_in to next_out. + * maximizes the opportunities to have a single copy from next_in to next_out. */ -local block_state deflate_stored(s, flush) - deflate_state *s; - int flush; -{ +local block_state deflate_stored(deflate_state *s, int flush) { /* Smallest worthy block size when not flushing or finishing. By default * this is 32K. This can be as small as 507 bytes for memLevel == 1. For * large input and output buffers, the stored block size will be larger. @@ -1742,6 +1723,7 @@ local block_state deflate_stored(s, flush) s->matches = 2; /* clear hash */ zmemcpy(s->window, s->strm->next_in - s->w_size, s->w_size); s->strstart = s->w_size; + s->insert = s->strstart; } else { if (s->window_size - s->strstart <= used) { @@ -1750,12 +1732,14 @@ local block_state deflate_stored(s, flush) zmemcpy(s->window, s->window + s->w_size, s->strstart); if (s->matches < 2) s->matches++; /* add a pending slide_hash() */ + if (s->insert > s->strstart) + s->insert = s->strstart; } zmemcpy(s->window + s->strstart, s->strm->next_in - used, used); s->strstart += used; + s->insert += MIN(used, s->w_size - s->insert); } s->block_start = s->strstart; - s->insert += MIN(used, s->w_size - s->insert); } if (s->high_water < s->strstart) s->high_water = s->strstart; @@ -1770,7 +1754,7 @@ local block_state deflate_stored(s, flush) return block_done; /* Fill the window with any remaining input. */ - have = s->window_size - s->strstart - 1; + have = s->window_size - s->strstart; if (s->strm->avail_in > have && s->block_start >= (long)s->w_size) { /* Slide the window down. */ s->block_start -= s->w_size; @@ -1779,12 +1763,15 @@ local block_state deflate_stored(s, flush) if (s->matches < 2) s->matches++; /* add a pending slide_hash() */ have += s->w_size; /* more space now */ + if (s->insert > s->strstart) + s->insert = s->strstart; } if (have > s->strm->avail_in) have = s->strm->avail_in; if (have) { read_buf(s->strm, s->window + s->strstart, have); s->strstart += have; + s->insert += MIN(have, s->w_size - s->insert); } if (s->high_water < s->strstart) s->high_water = s->strstart; @@ -1821,10 +1808,7 @@ local block_state deflate_stored(s, flush) * new strings in the dictionary only for unmatched strings or for short * matches. It is used only for the fast compression options. */ -local block_state deflate_fast(s, flush) - deflate_state *s; - int flush; -{ +local block_state deflate_fast(deflate_state *s, int flush) { IPos hash_head; /* head of the hash chain */ int bflush; /* set if current block must be flushed */ @@ -1842,7 +1826,7 @@ local block_state deflate_fast(s, flush) if (s->lookahead == 0) break; /* flush the current block */ } - /* Insert the string window[strstart .. strstart+2] in the + /* Insert the string window[strstart .. strstart + 2] in the * dictionary, and set hash_head to the head of the hash chain: */ hash_head = NIL; @@ -1890,7 +1874,7 @@ local block_state deflate_fast(s, flush) s->strstart += s->match_length; s->match_length = 0; s->ins_h = s->window[s->strstart]; - UPDATE_HASH(s, s->ins_h, s->window[s->strstart+1]); + UPDATE_HASH(s, s->ins_h, s->window[s->strstart + 1]); #if MIN_MATCH != 3 Call UPDATE_HASH() MIN_MATCH-3 more times #endif @@ -1901,7 +1885,7 @@ local block_state deflate_fast(s, flush) } else { /* No match, output a literal byte */ Tracevv((stderr,"%c", s->window[s->strstart])); - _tr_tally_lit (s, s->window[s->strstart], bflush); + _tr_tally_lit(s, s->window[s->strstart], bflush); s->lookahead--; s->strstart++; } @@ -1912,7 +1896,7 @@ local block_state deflate_fast(s, flush) FLUSH_BLOCK(s, 1); return finish_done; } - if (s->last_lit) + if (s->sym_next) FLUSH_BLOCK(s, 0); return block_done; } @@ -1923,10 +1907,7 @@ local block_state deflate_fast(s, flush) * evaluation for matches: a match is finally adopted only if there is * no better match at the next window position. */ -local block_state deflate_slow(s, flush) - deflate_state *s; - int flush; -{ +local block_state deflate_slow(deflate_state *s, int flush) { IPos hash_head; /* head of hash chain */ int bflush; /* set if current block must be flushed */ @@ -1945,7 +1926,7 @@ local block_state deflate_slow(s, flush) if (s->lookahead == 0) break; /* flush the current block */ } - /* Insert the string window[strstart .. strstart+2] in the + /* Insert the string window[strstart .. strstart + 2] in the * dictionary, and set hash_head to the head of the hash chain: */ hash_head = NIL; @@ -1987,17 +1968,17 @@ local block_state deflate_slow(s, flush) uInt max_insert = s->strstart + s->lookahead - MIN_MATCH; /* Do not insert strings in hash table beyond this. */ - check_match(s, s->strstart-1, s->prev_match, s->prev_length); + check_match(s, s->strstart - 1, s->prev_match, s->prev_length); - _tr_tally_dist(s, s->strstart -1 - s->prev_match, + _tr_tally_dist(s, s->strstart - 1 - s->prev_match, s->prev_length - MIN_MATCH, bflush); /* Insert in hash table all strings up to the end of the match. - * strstart-1 and strstart are already inserted. If there is not + * strstart - 1 and strstart are already inserted. If there is not * enough lookahead, the last two strings are not inserted in * the hash table. */ - s->lookahead -= s->prev_length-1; + s->lookahead -= s->prev_length - 1; s->prev_length -= 2; do { if (++s->strstart <= max_insert) { @@ -2015,8 +1996,8 @@ local block_state deflate_slow(s, flush) * single literal. If there was a match but the current match * is longer, truncate the previous match to a single literal. */ - Tracevv((stderr,"%c", s->window[s->strstart-1])); - _tr_tally_lit(s, s->window[s->strstart-1], bflush); + Tracevv((stderr,"%c", s->window[s->strstart - 1])); + _tr_tally_lit(s, s->window[s->strstart - 1], bflush); if (bflush) { FLUSH_BLOCK_ONLY(s, 0); } @@ -2034,8 +2015,8 @@ local block_state deflate_slow(s, flush) } Assert (flush != Z_NO_FLUSH, "no flush?"); if (s->match_available) { - Tracevv((stderr,"%c", s->window[s->strstart-1])); - _tr_tally_lit(s, s->window[s->strstart-1], bflush); + Tracevv((stderr,"%c", s->window[s->strstart - 1])); + _tr_tally_lit(s, s->window[s->strstart - 1], bflush); s->match_available = 0; } s->insert = s->strstart < MIN_MATCH-1 ? s->strstart : MIN_MATCH-1; @@ -2043,7 +2024,7 @@ local block_state deflate_slow(s, flush) FLUSH_BLOCK(s, 1); return finish_done; } - if (s->last_lit) + if (s->sym_next) FLUSH_BLOCK(s, 0); return block_done; } @@ -2054,10 +2035,7 @@ local block_state deflate_slow(s, flush) * one. Do not maintain a hash table. (It will be regenerated if this run of * deflate switches away from Z_RLE.) */ -local block_state deflate_rle(s, flush) - deflate_state *s; - int flush; -{ +local block_state deflate_rle(deflate_state *s, int flush) { int bflush; /* set if current block must be flushed */ uInt prev; /* byte at distance one to match */ Bytef *scan, *strend; /* scan goes up to strend for length of run */ @@ -2092,7 +2070,8 @@ local block_state deflate_rle(s, flush) if (s->match_length > s->lookahead) s->match_length = s->lookahead; } - Assert(scan <= s->window+(uInt)(s->window_size-1), "wild scan"); + Assert(scan <= s->window + (uInt)(s->window_size - 1), + "wild scan"); } /* Emit match if have run of MIN_MATCH or longer, else emit literal */ @@ -2107,7 +2086,7 @@ local block_state deflate_rle(s, flush) } else { /* No match, output a literal byte */ Tracevv((stderr,"%c", s->window[s->strstart])); - _tr_tally_lit (s, s->window[s->strstart], bflush); + _tr_tally_lit(s, s->window[s->strstart], bflush); s->lookahead--; s->strstart++; } @@ -2118,7 +2097,7 @@ local block_state deflate_rle(s, flush) FLUSH_BLOCK(s, 1); return finish_done; } - if (s->last_lit) + if (s->sym_next) FLUSH_BLOCK(s, 0); return block_done; } @@ -2127,10 +2106,7 @@ local block_state deflate_rle(s, flush) * For Z_HUFFMAN_ONLY, do not look for matches. Do not maintain a hash table. * (It will be regenerated if this run of deflate switches away from Huffman.) */ -local block_state deflate_huff(s, flush) - deflate_state *s; - int flush; -{ +local block_state deflate_huff(deflate_state *s, int flush) { int bflush; /* set if current block must be flushed */ for (;;) { @@ -2147,7 +2123,7 @@ local block_state deflate_huff(s, flush) /* Output a literal byte */ s->match_length = 0; Tracevv((stderr,"%c", s->window[s->strstart])); - _tr_tally_lit (s, s->window[s->strstart], bflush); + _tr_tally_lit(s, s->window[s->strstart], bflush); s->lookahead--; s->strstart++; if (bflush) FLUSH_BLOCK(s, 0); @@ -2157,7 +2133,7 @@ local block_state deflate_huff(s, flush) FLUSH_BLOCK(s, 1); return finish_done; } - if (s->last_lit) + if (s->sym_next) FLUSH_BLOCK(s, 0); return block_done; } diff --git a/zlib/deflate.h b/zlib/deflate.h index 360ca23ff342..300c6ada62b8 100644 --- a/zlib/deflate.h +++ b/zlib/deflate.h @@ -1,5 +1,5 @@ /* deflate.h -- internal compression state - * Copyright (C) 1995-2016 Jean-loup Gailly + * Copyright (C) 1995-2024 Jean-loup Gailly * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -8,7 +8,7 @@ subject to change. Applications should only use zlib.h. */ -/* @(#) $Id: deflate.h,v 1.1.1.2 2002/03/11 21:53:23 tromey Exp $ */ +/* @(#) $Id$ */ #ifndef DEFLATE_H #define DEFLATE_H @@ -23,6 +23,10 @@ # define GZIP #endif +/* define LIT_MEM to slightly increase the speed of deflate (order 1% to 2%) at + the cost of a larger memory footprint */ +/* #define LIT_MEM */ + /* =========================================================================== * Internal compression state. */ @@ -217,7 +221,14 @@ typedef struct internal_state { /* Depth of each subtree used as tie breaker for trees of equal frequency */ - uchf *l_buf; /* buffer for literals or lengths */ +#ifdef LIT_MEM +# define LIT_BUFS 5 + ushf *d_buf; /* buffer for distances */ + uchf *l_buf; /* buffer for literals/lengths */ +#else +# define LIT_BUFS 4 + uchf *sym_buf; /* buffer for distances and literals/lengths */ +#endif uInt lit_bufsize; /* Size of match buffer for literals/lengths. There are 4 reasons for @@ -239,13 +250,8 @@ typedef struct internal_state { * - I can't count above 4 */ - uInt last_lit; /* running index in l_buf */ - - ushf *d_buf; - /* Buffer for distances. To simplify the code, d_buf and l_buf have - * the same number of elements. To use different lengths, an extra flag - * array would be necessary. - */ + uInt sym_next; /* running index in symbol buffer */ + uInt sym_end; /* symbol table full when sym_next reaches this */ ulg opt_len; /* bit length of current block with optimal trees */ ulg static_len; /* bit length of current block with static trees */ @@ -296,14 +302,14 @@ typedef struct internal_state { memory checker errors from longest match routines */ /* in trees.c */ -void ZLIB_INTERNAL _tr_init OF((deflate_state *s)); -int ZLIB_INTERNAL _tr_tally OF((deflate_state *s, unsigned dist, unsigned lc)); -void ZLIB_INTERNAL _tr_flush_block OF((deflate_state *s, charf *buf, - ulg stored_len, int last)); -void ZLIB_INTERNAL _tr_flush_bits OF((deflate_state *s)); -void ZLIB_INTERNAL _tr_align OF((deflate_state *s)); -void ZLIB_INTERNAL _tr_stored_block OF((deflate_state *s, charf *buf, - ulg stored_len, int last)); +void ZLIB_INTERNAL _tr_init(deflate_state *s); +int ZLIB_INTERNAL _tr_tally(deflate_state *s, unsigned dist, unsigned lc); +void ZLIB_INTERNAL _tr_flush_block(deflate_state *s, charf *buf, + ulg stored_len, int last); +void ZLIB_INTERNAL _tr_flush_bits(deflate_state *s); +void ZLIB_INTERNAL _tr_align(deflate_state *s); +void ZLIB_INTERNAL _tr_stored_block(deflate_state *s, charf *buf, + ulg stored_len, int last); #define d_code(dist) \ ((dist) < 256 ? _dist_code[dist] : _dist_code[256+((dist)>>7)]) @@ -323,23 +329,45 @@ void ZLIB_INTERNAL _tr_stored_block OF((deflate_state *s, charf *buf, extern const uch ZLIB_INTERNAL _dist_code[]; #endif +#ifdef LIT_MEM +# define _tr_tally_lit(s, c, flush) \ + { uch cc = (c); \ + s->d_buf[s->sym_next] = 0; \ + s->l_buf[s->sym_next++] = cc; \ + s->dyn_ltree[cc].Freq++; \ + flush = (s->sym_next == s->sym_end); \ + } +# define _tr_tally_dist(s, distance, length, flush) \ + { uch len = (uch)(length); \ + ush dist = (ush)(distance); \ + s->d_buf[s->sym_next] = dist; \ + s->l_buf[s->sym_next++] = len; \ + dist--; \ + s->dyn_ltree[_length_code[len]+LITERALS+1].Freq++; \ + s->dyn_dtree[d_code(dist)].Freq++; \ + flush = (s->sym_next == s->sym_end); \ + } +#else # define _tr_tally_lit(s, c, flush) \ { uch cc = (c); \ - s->d_buf[s->last_lit] = 0; \ - s->l_buf[s->last_lit++] = cc; \ + s->sym_buf[s->sym_next++] = 0; \ + s->sym_buf[s->sym_next++] = 0; \ + s->sym_buf[s->sym_next++] = cc; \ s->dyn_ltree[cc].Freq++; \ - flush = (s->last_lit == s->lit_bufsize-1); \ + flush = (s->sym_next == s->sym_end); \ } # define _tr_tally_dist(s, distance, length, flush) \ { uch len = (uch)(length); \ ush dist = (ush)(distance); \ - s->d_buf[s->last_lit] = dist; \ - s->l_buf[s->last_lit++] = len; \ + s->sym_buf[s->sym_next++] = (uch)dist; \ + s->sym_buf[s->sym_next++] = (uch)(dist >> 8); \ + s->sym_buf[s->sym_next++] = len; \ dist--; \ s->dyn_ltree[_length_code[len]+LITERALS+1].Freq++; \ s->dyn_dtree[d_code(dist)].Freq++; \ - flush = (s->last_lit == s->lit_bufsize-1); \ + flush = (s->sym_next == s->sym_end); \ } +#endif #else # define _tr_tally_lit(s, c, flush) flush = _tr_tally(s, 0, c) # define _tr_tally_dist(s, distance, length, flush) \ diff --git a/zlib/doc/algorithm.txt b/zlib/doc/algorithm.txt index c97f495020b4..029e5a313498 100644 --- a/zlib/doc/algorithm.txt +++ b/zlib/doc/algorithm.txt @@ -77,7 +77,7 @@ table took no time (and if you had infinite memory), then there would only be a first level table to cover all the way to the longest code. However, building the table ends up taking a lot longer for more bits since short codes are replicated many times in such a table. What inflate() does is -simply to make the number of bits in the first table a variable, and then +simply to make the number of bits in the first table a variable, and then to set that variable for the maximum speed. For inflate, which has 286 possible codes for the literal/length tree, the size diff --git a/zlib/doc/crc-doc.1.0.pdf b/zlib/doc/crc-doc.1.0.pdf new file mode 100644 index 0000000000000000000000000000000000000000..d6942ecc09a3f8b2d7e4b6fbecc5955121e8e7cf GIT binary patch literal 776142 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

gbSBECSF!sJ!n%j3sKWiI~H^IVy$tVu9%T zDg4MAu2;u4gG|;Td{`Zl(l}hK2qS;I4CR^z8}65=bPv>LGKJxgm1v9#_l5C4%%8ao zm~9~{g5Q3zk$#@z{eYFgm=})8l+(=JFdsWg z_^Id=D*yg*F4&MChm1E}V}8H}U+5cdM3MC}*&ShokX<=_hpH2Jhgt!Jzj7N}Mj}#C zRYH=asNnF!p$;Xy#F0bT~n`EzZ6W;7s6O8zIJr^*&0h$ z0GL+)DJa1vD)4Yr-CV?@seEzV``lf9;jG|~@VH3YFz>XSTis)C4f%u4gNu7zj)K2T zJi}p9*)%=s?byUQ%OloI&+j81*V@oXkp)8- zRwYh59k7OI7Uq-rvYm9bsagv@&%c!Q9`?1rEo+&VvTJ)Qp?v^?;3QpBCzibdeH?>;#2x z&4Wgh(JSI!NQs=Cnu$FvGi@Uo?I4#LYs1V`Hk-C~b@aveX+rn&%qX*FU31ejf+w1= zGQHzc>6OAa5vlBt7MqK-nMQ~aEB&oz_1RL?4MrY}rzGlp@pt)Ky`(*@zO^CTfGL;Yj zHDi06<+?g&tU(vPhVXB%;tfO z>)$VOs-u;(`Ja2740ie!9Qj@hwGd-hzWm9H=yIOg<<$4T>^Wv|Wf#H>-^LvUwCWn)q8}j_?vCD% z9r>quwSBN^|9p49pJfqZ(@sayibpH);{YDw=89SDq@#_*gY?S_6Kug6BrtvnaPTUL z@oJq1sjYeo=E(xuVt4;+k)2`jp2D{o2g7XQGD&1lkUtY-eIf{=vSiHup_3YPVc;N6 z3>)_T#L6gA3+C06Js`Fd_R8b}EfRu-raflDOJLI4JwE{`!_B8YN&k{3N7-VdRw6eu z{ER*bhJylGnYFQa1L#xva~24yWb&~kE~uO7%T}>fk}31P);^j&vvGJq(>vQ4K(oKI z2j%IoiV!v~NuXL?wZfauL-S5r9jbD0!jVB6zfJ50S}G-VMbS;65F0#|j4+al{;9fH zF2nb+vH3)=*3UYsSWh9%9A~|K&vB7-aJ_M$L-vd z1k+5!FqBb^N??*tMj2jmmxY3{A0I?jYfZu_N3hCgsDX$PF!=N~wtEL2bxtzn>|^%L zDtHU=nQvlF7GVo1Ibxaye&3MBJ~w%l?EM>Z1KWp%>dfxWnrF9#4Y zBn|1t?Dj zrC^RS*PG|J;1XbWAeAsgr!m)ns$+jP@3wSF4VgI<(OEe|Z-3)wT=}B_SBU|YG1zfh zBS2=3aQZ*;P~h+JVpt-Qc0eiQ6}p)o&3VGpx92MN| zuPDOLHi)DG-O>gsg?Z-2%chIiN-~aTyk~af)@(=%L0=zl8o#b5VH6=#fTX=&G(5&K zbE2R=u5j_u$pZzm09~zc1tkrSeeU0zW5JF-~f(@^6KGMmDi|hn^!KwGg*5k zMGeo!vCYUIR)dS!;xs;rGqsF(a@omBBR$X%9&wWqUZEZV!4MG(x{HUF5gqpq2A{gA zU&6W8@>E8NkZ-nFjJ1e|SB6-2FHP<8;t;yAHcN)$5cHB7QqPZC_Z4rsDtPx}ufz(b z(6RO|^lz2&CpUMZ#1E$At+nt1!zlyiQ9FLP8KI;pmi9kMmUmFCyMSUGVZaB@u+N2PeCC-)Z|+S(!LG>r;$Li2BtYH6SwtSr{{*0D_eRV_|Urv>?2muk#E>5eq~B}+qHb`Qc32uokx(QSKT zh$4{o_)QisFBt%nBI3Ii0zNu7YlL*)hW?PC48jAB-wbCgK1ICVG$Jh&6X~|8--+VJ zI;QBh#Te$i#5Lkp5JLuDYPq;1EqokRsu9i)qn$0?QFy;(W0#ku7m`6YeL!_O5*md28V7ZLnHRnMsH06_+TTjcC;Di zrQT%>sP>H#86NaL-{Fqku@9U=dp+<5pp!4Zq3e2WV^#X_zEjOyx(R_ zkF2Y3=pj-T5T{droKH8l!!KpEQ1RXDI`)r7hiZqvTW6}ONk4W`%De1>1;i|dl?nt_ zmsg92huwxYDSYLpr(V(0d^7Z2{c=*A@yYNIpkcX%g5V;N<=59PTL&!d9MWmKjf_V% z+3E(v0N+A)NTF{X?O=d_M}r|j<4tc5WeuO=lk9sl`{Lde;&AOlhgdSI`qOoy6ID&7 zms~zphS_wTH*_LxvE*RrWf96+=DW&b}<;4FfFxz*^@MJlE%P;dMC!vk#S+8Hpx_!2CFInAneDlh` z5fGCiDe|}8T-CHQp68D?ZuN1=)z3L`a?CX! z&+!4Cd0-pHD09udf8$nogNvNy2ERE(@Va}TH4#Ib`oj_i8p&v991GT@s}abP)1@Rw z*t0ZI#cz;rWnkcXHZ)l-QcwRDNfYdJ-_c*3!p_dR0J3{j{qQX0)A9(m6Rg@qSC(lS z(U&E(cL$(YrTg6uSib!v!;i+yBC|fl^81}z-8c%30Ts=pp>yQCe`k*^fD3JQ%9J&X zH9_-=jorp>Gno;uB)I~>}Y67NM zbS2-U8g36S|FGp67$#CeZr*fEgAZuT-W{ETAb~gByikzI*^!W8Z>xxocEHsb-);JS zdhkTwI{WDL{y)sUV~{7^w(eV9)n)TvwrzFUwr$(CjV{}^ZQHi(E?3>Yu|M2%&Uz!( z+WSV_xF0hj=gf?pIWvD_&M}_nXD}Z6)*_LnkpsqHAs#=x2nH_CY`H@ely~s^oUp#$ zFpMP!H+$E~6VrNGeP%+HkMeOn6I`ewC&q1?5^?e z;Z1syjm&%NN!SW&`%yhsU8&H-%h-M1D)ek#b!s+H^2Jw8q{+Pj0Pkkk3omG!I@~`n z@V_npXaAS-fA;^Z{GXlW|6pKt#{YjZ@IP$-GO}?n|2Nz;6E|3qx@T&3m3uw1%OshzuqoH0(W$^ zy`G0nV%VpgU7mOh1rQ3Xi<1bnN-r(qKC@*bH_RERhH-2j+--GahO?@FGv{>Pe7HXy zxZ0vuJn2!-aTV<4GTFQj`5}p;mFjZ z2SNTZxnp7oVHLtscD}c9L=XwL&$pPxku5IRuKloGdM=jRCmv@vyEC7|+E-1UA+rZ= zy6%{yHz*oyzim`eo)J*Ij}tOabf(EODbaF5L9>Qp001Q zM-T4dB)YWt0Xiqeb~qzc6(3xp(iCr&PbAH*Yq0>Ip#Vk`LYE*$vSMoG3Yn^xQAq{M zFq=PtZckY~=WBBGB3MEdGJ$H3$ws*^D~!joZ=&U+F_=*r>{fvtI`f<>j$?B# z9C|dMV-^T~oKHH!3fbmx9u@?y>$&}Q-z(L2Kvia+bPBGd$L@Z#oG3AvNTiz%}kzN7v&g7h8|KJ(kt;S3h4P3Z}_qK&QKu4p0V|s zTmZ8?M86oU|7T;U2Czf4%JxLzQiQ#lzVLpTG;nCG_#`xd2HO(4deJeMF4vzlfv!e~ zI>Ev~!7Es}m#fsYWjPj1mQ|9Tdu zy_ZIxyH8p=hn&$6T*hm-caRnT`PH3R*E+0xHK@>)K?!1>1rcIYgOQK3A|J{zH)lYJNH%3g<8C9abQaZD@~tSYdg4JG;4`jc>FPh4RMp5=F%VIk_mb!8F48l z_xv-fNz&j57g!WyZJ(O`1bIF_C|7i9J7HQK5)MKUI==BT4F}9@4`O;%S!sb$U`wS~4ysHm?P*TqXaev^qSxtfV`W_<5xmyS%)6-;FIQBZE zX*ZOI*YSAD$2RYf$}RLNAq`Gj9XMB#TCQJ?jBDHTf^7Fw-=zF5!txXt z_Pc{1!ZzbNLC*4m=W`uul+^OXKP#<>pJf$OWUtT6?6#k(;#vu`}9|O^@E`D|1eb zYX&`^E*jamuO(LThv15zkE)wumQt{BHa5*ZC#fYH7xi$!k+DQLn9S72L^Hn6IN_yX zN#zy3Y%x8M%x6)^JW{4|jZ_jTg$2$DL(y3VIow25)W7Qbn-0$o zwq>XLNq&>+9eVA=BaTpeLEt+%&c9ZOUL}W3cbw@0>f6=nY*t&@`A(DL8gRO0<>9KT zAW+1^*1#JNZ%TdDU&l9->A$+;sadpS;@D5gHv_7jz5{JWrd?_>0Qw!s$dNTQFl5Dm z`7{jDNw0Qy=DXPyKTJ&4e|nPDsCZLoJ$fUYKmFSh$WSj|jncTt3q|XrOyu;tN9#kW z`|Zr}u0YM>mu`>9aAFZ}Qj?>2P{g#?;($b6O;+_RXOBot9AGb>7h{X|SZ#r}aU4+B zh+z{nZ}MWj-GPg?)z|oONp&%@_XmOwZNT0A7xnv{n4fKz$`_0@_)sM;P0c5#5=fFE zJWr##dbEHEVJf2vC93Y*&=nVo*n4@A#~cfL&c^J?Vh5S7J~wpqMFZ7-*9Crnk~|BE z2^~BjydSN>8ve{7vWTM=>6u)Of!&M>i-h^ejg`(rUTrK9M*(qQ(woxnQbeLwy%SmS zC0Xq_o$_w|!n8TOhmga%Mw|9~ssZ z*sekv&UExVk?uKgWE)wd>?%($*+j7vY9^G}zyWkVorWP%C+gVt+lwC-l!l>I`ncCi^WSLkUv5noS~H+kkzH%}%$XwRJK9ibq3@YTy@AZM`Y6WrBl z&meHD)E{acVLr&NQZx{YzSN0OhOWUKfV<3AV2b{u8!PND4D>qV>8;eM&(XoZG@x63 zxBIx_=1Sk|G(>vcTTV`dOLfb|%pNC1)ePKalSYZc>%gsdx$H@h^1vzTkwnPtj zPL<|u37Am%F#V*#-996=wJ4~)h(9{eHoWn~I^qv||6p+fYoPs5O0Jx>JLJU!3v9;2 z8t|||K=@rJ+XsDG@1U>B z+o0R%12q^WSqgMJM7l&s^q)6LT}_J1v8^qMJ=nIGbn97~MVjgfaFn}yCHO;Mdp9jTh&d9j$)!1;VpjmJ;n{4uRSO$<$II|xh-Eci2x~vO64&ZSC=jbEZm|5?sW-!As`9I)rFYyYQU@;#R3m&R#8t}#CXm}fMj8_3$zkcQqzdv9G-tgPkJ%Nw zR@&*7wym>TH_h%|(Y+E%+ozdP!zLV<8P!p+v?;^OUffZ$G_rIVWNO)j&us|8KT)4O zLM7*eFTFmY$fX5Ca;qZu@TsRGLi<5iy%2q$AuL|Mgtw%q7?n)zPoZIWY&2-NRwYDI zC=x-1D~s+a(M`C5zz9hPe}we5W5ZV=y}=*^mSmDo4&&zh(B#`U&?szQ7_27Dvj^Vb zv$WQRL`q!A6-P{RGJes{bCZdu#tO9~T(Bbqo%Js&_8Ck{5(B^8;UyWz#E!35S;DWJ zm~i(Ja-#X#7?0eQ#8~zYv8|ml#qUp7p%vssyq^lpUMc2MlOn1bp2t5r(;a}0jikd@ z98UWa)VEKO>^%dr1>Q!cun;$@Y!l<_c9luT3ijm)Cio4fMgg! zsRjG>6>48`1krGNjVyfwB_3Mn{zLHaZ*w)+|0P$0o%MehJh1*xb&~&k+F^fhgq`C* z4<0!FLBfHFnejhfKtIy5w#9Bi{JPe)pDIB`n#))F-2S>GQ1Sa?UnN9m*0(^xDe_@x2k-N0u7(OJRVge)Os%M@Dt`3mBP*n#(ycum zQgR5e6ha*VIhMkV=c?F2=gt1`sNBz@#Ii)OagSf$XjR17T)vMlk`R%(3bVCtUkkwa z6o5FfxeZJ$E?)Ic?A=`inAW|szPy$JRGck4FFSOBL&?6oqTQnetZeb`=ttW_H%is& zLSNcX#WOtd@6YvA0!cW7&a{$A5J>_MO~GIGa4wQf>-q+z`U)8PVisP?2-TyZI zb`!dJ-_7`2%?Wiu5?>|}*mRNJ?O&3MzUyGXIJ)x-Vg^hVt>)FqR@NGe;LuY*9)Cth z|KPpJzdh?D))F{UJdYP*3U?Q8J^al?(bGgC?xyg3FnLok>21;hIq4!6?R$+K77?KRV&|9z2tEiS`Agd&Fh;vPnj=fq1Aq{MR8fCZL1j$ zNY&5?jy3ED(MCU5)S+iu#(~#eikA!bT_9<>-p9J^dD*i_AB@Kl0n>Y_C=|XFfurZoIiG!gH-FEkY%vHq^3MUcPQ075r<`XC~G!7={j%c~l)f z+6br^X#9J$nj8!r_hCQ2z;R%u z5PC94P+@_H11dCtnmxK7#yZ6JC?q+jL|9_;wy?bgrt9ZBM2moXa+duqa7CsGC){BO z+yLmEY%*tnn-Ps06~7L0at&gBG9C+ShA@>uUgXJZWmIQXSnr%c%PdL2-$#kqn(IX^ zfpHV**9UQt4{vZfy1jMCw69+;Ppd)IUu*E$N`NMG5E826IsQGyA%pQ^P^=tcuOL`Ul_hpqmWqjgUyd+gPMO&PiG`_-N!6te(;xC+e zg{<0YbLM)c<)oMz6`8EKX;$X(u-`x68yMAn@R88<=uwC&obIihAegsC@5B(mc#W+3 zU;>P?Qd$vkOaimZ!En0jo2e8mN#*z0NIfd#USKD0h~<$3?AYhLCZOyF0LX9H`5FPi zGbMXLu97{zS%zy3n;*l{$$FFYA((ISQe_|H44^s(5Hwg8Hupa>IU`vu)T(u5$(?!i+7m!eI|vg_eVfbHc+iLyZBzp zAOl6Jrvh}(fZ{x}7lZivxHmx>h|ex6K`%HFo1Od3y7G{p>DAJs8$rT1Hoz}_`s-BE zn&LpL{s9fHBDN^cOR^`q0}e@HQt!nnk0<$s0W>AEQC!-1F)qQJSSqDyiK-Y5(kBzl zBhD{|rS6v&J~XPYKGTUwF)2GiDu*T+25$pxgEgj=-)lXow+e4t^eywoHeb>tbWAvq z@_SEm(yw}u)O}9TvD^NRJl3nnJ|5YoP_iWx5BVoK-&ns94?HkvEu@Q3Cd$CbQR<47 zYe)yA0WrU=OM-wF?SW=rNlJihO`&hUIJ~SB2<(8X!y%U~YRftwZGQI5?pk39?yjB9I1%xYVyVC;d??hYUdFo}#?>&sWK_@qT;}f&t4k`g_V(Fzt#vc@`{#Me7-19M_|#7H)Y z3?zrY9W_UHbM%KT9h+W=X-li(uSn%HYMPSI(wakwSqWs~b?YY?oE#dBM7_-%l9vyA zoEX7Rjcunq7*CdA#~!}DH&Kx}coD4775O%~e1>cFBz`?Rcu|c=w)s$f(y?nL!f+%H zj+qhJO%Xfjy;`s!r4S&lWs>bj-wZ}>j>^NRjs@b9;y6BHIzFbm9D#Abc_%7XeI(Kz z4y*Q|S3x{#mnHpuDr1@zd?|5AETLFL$bVq>T!XPWDH|dl$PaUaA72~W#Hm1ZVAMBZ zZD31FJNmo+Ht@l$=%k@Q%w!HT=dLgJ*AyaLOY$@$l}|%Q;)FS%WpK%J0Y+hX4E{UM zD3J?T`5=P~pnbaI4lLUoNI%&ej5guy`vv28ch(mq!PbgN{N*R2mUzQ| zzCI;(ws@y!)Za|qW{>VzZ~hunyZLeE=n+Vt;c;v|iaES2qP_)iZb~Q(lT}35ms|}_ zW@r}oj37uTBND}NR3KS;?t9(@&d*UDa}ma$B0g>t{1FOOH@JRk(w3+{X~Nhnghmci zP+G})W~Qv0+?XU_JkC&BX9V#Xl+|DONa?Lqrx*fk0IMC=m?mVbLr{7uQR>HE&hfFX zgH(0V+>(00rPl7n;7u;AsAHBz@?L!k2+ zK(KO{t41`r3jJV0z#^5NJZ14Md(vN~m4-SIvloo5`|y=>cwDe(0oi`*PeZ$wd-KA_ zy{34GP+;&o%5}W0I=4DaNLVGCUY61g^8myW2Nz}ehxv0kS^3i z6=6*(zh86WAmWH6-T(Ja^|DY|r4W(1+yL9CNv7EM*?q*K$ejodfCseA&}ayK^xEPj z^3k}${|rOiHkrY|t~dQi2mLY<+<>+^BJZ%&<&tc@Gl%>L2_i(?j*HA zly>d!XpP47dPZP_hJ`Sg4E~^9aGZdhYftu+TXy09`a8Xf;|B)oI+qG5Hc?2- z>q1%Cb3@y2?f&*Q*!mM43b&a9dlEzC2lArY4}!LA3X$C^hV%%bDRK%}8yklP_Zls( zsVU`d*Z=zy%66j)kdzZNrE_p>yK`%M_Byy*Y2%m?ggUeQBL5-cOk&EzMlrZXNwb(; z*go?tXC}{a`k?Z6)+!t&9MP58zD*sS8gkdOz*mZU&YHSub-~pR)bHIxa~kyoe-z=f@f6TB zOS>3nygU>&Q2S$SIci)zkzfhamfs9Ss6e4&*uS=6^`JFn`molDa>P&-vG&wBV57TA z>pE!2cZ(dtoY#lB>kzLe6kM!JSd+>lM!=277*8zU0c;CncMhwVLT))lUpZqoEKFZ7 zuZFuiyl(JbFQ+sT8M3DNL(#worsTU-ap{Mhb7N& z(WFCbaJ~;=#yRlYfq!R+Pd?za0(&=VYX4vnDgkyehDsM#IvzqjHH@#liYO&;3+|o> zWBL1oje;(7hJ>@egoGoAGlbCgJq{KR+V%LFoZumL`ASQPc~%=MjmIJ^5HlcZxneqK zTMsZf=Eoq{d%kG6$Y@~WZ5U$>{3gP%gfhwQ+LNBhSg3edC;)kt#B^fkehm_}CqT^7 z*2y|F)p=OkTFffhxjS3%x_G(Yzv{>+$Y_vU>m~IjAeW#Nz4q(OR;SA{w0>c$XeQkI z*LaoV-ztD`{EGqz2mSvnUgh}zNCAZ7pAFS=kuTUCE zV?95=wo5Wm*GipA8jDoxTip6OZz0#MT2MNg>zFxN;*=!1*cxM{%6+Q`lZhAIb`jii zt>C@>dVOI9X!Qi5A)2LwHF8v+b{!3#uH?p(^hZ=ld2%f4b+%HSSCrN}6o{eAy zPs6v~Q-|HDy6xl)4{LLABR!ONV7Q8(qabL-#Qy#hUf1o<@j*{b+WVg?I*TrGq~n~+ zvZq*briirSJJu8cZ|fI?Wj*!0<%c9{jMHKVa+uweqHzNtfK1lfx6ubY03fgV#_dQa zngshTV;l;K=RExZwI=F%ZH3oBILAty1XWJGKV?Fs60TS`v1L&~G)ra)UTI(dSy#33 zJ|gT{n8Chrk6~+pAYd)(i2pi?ZP7vCh=T06E5HDrfa^4uo$4~>ewwzK;ytDm8T!?f z&y@PGLdhn7ru}QQtD~JHBN6kECm`kOu~p#^Nc4eQZs_e&Z_7bp2&%cwSYK+!q4jrc0e`q{pu2uZ$@uC+t{se3FJjR zA$aTxZFQTy+<8*A>oqJKt}O>~o}{3Ar_}jAa6n+dl|2KnCbsn<2tcX=dw@9+*h_yL z%M~Jh?!!Wt@GvJR|{+X=M-dRaDm%-T%CtYF%#4{ir_@2f}`DJ2A%D#J5@J&!uQU zb?n<5+w$bm<0&Yvj)vxcf1TBq@f&yON_}VWH4zc+@K+E(!*{v2$mDtXGpKayq2}?2 z=B$IT_l&chCUC<_cj&emB~+NO7SfX;+s)D)Y)W>?e^Pu8IP!CrT3kzkl3p%l8!s(j zF>q)hb+;zXTAoOb`%bKSda|&&UpU8_#SR0EC_vK;YqPDn9u^bYLm91}nlYA9a+-{f zn^u>4ht5?82oD+&c4;F%=eK_FYW}F%idcI-SF+SVayJte`Ns$L4zym9}@LTN?G8aeD-lDM)Y-1La+#J>h zAF(x^3*rq}3K}6*d!us|J&0%PHmN=Yb3Co1jcV>kF3*Q-Hl>2(_{f0z(3cowdin(}nFMx8 zs3u{5G=#|@pW-uYA}#=sWl_sK!YORBYIXgsM_Ox3^wZ|rE^`|lQYg|i{^!$VYPxjn z)sIYiCw-8bW`tym>YAVhGbzVqtfEyuaals&8&bMyd2g z8W1~nBw6lA^A{G!tEdZnD_isev5DVuFb2~qvbtiJ>zxgntUp|!+aT#(+=Ph_X4Kjw z7JFBMo0zY!01!{2Q65ejr$TbHGsHaG zjjl-KH#Q9?M59v>YFYp6iPNN@6e>G+IE0B9PN3vylOL%6$j_wP+xN4DUqhB!rx8HV zl-XP`(x_0Bn-59b40`Ixwjjv_9DVhZL5)x!Wn=dk`MY*Xu(MXs_@klyHholYS_VjF zw7nkQr8ax1??`N^d(@^n1{|aITxvVhZ#2Oqxr8x5# z299H?Z;)<`HvS)(pj}%=K0W;tVMh>Wg5E~CSWNQsBjmn*%he?@Npe&`vS(e8b832# zPW#YEZNhIO*v;d-a*GU0lbkMX@D#tj4}ww19kNw_KmP96Ou*hSmp|6z84O#nQ=JMA zU=kag@anXcHDwP1OP%!#%F4*&Flq-g`%I9|FW60vuf$4dsU`^n-6<_$HmH$2DBNcY z{S{kzVZ|SzP_B-}3R-6*KTpw7q_75#-M-BA?qV^f+&t2P^8!-vi!OxQ*>X;<0X54cG8 zg|$v?w35lJp{q-@_8vzy*b=1snTaFv7NWL?=dt=BfrVKwJd`=nc(;usyGt4*JCYinUh}Vy? zh0BRib8c#SKCfuSB#O5H_H}AN(3dOlvmF_#wmgS`47iSkFou0Fi+mS>!$KRxIq3+88K%zG!Ex8<-ug8loBmAF=kJ%o%p+4`< zBb2r2&d&RZqui)$dE%^#Ci*X(>{y{6yodtC(QC{Kr2{J7o7W8h>PU?(_f_f2R=|vI z+Gx4mH3nFvQrbS?6_v(GZI*rP?&$9@V^ z+C{&5nKMu*?R0f*$oK)6L|dQUo|UfsTY#|ixXiTa8|Hy{Dk4SbMn=d zX<5ZJ!!@s0?CrVD4j2~S)xZPcQuK1k?`e#8@~ z;{4qe@^DHFw&!N*I3uK-R!UjuV)XMVaKmGYl|g;X1z;pJS&)&{S&R$NPQY_QM6Iz0D?4W&+S%pZEC_k1*cR-k*aVRzyME(4a> zRlPnT_uhzWBhDPNORhP!>EV}a&FtjNYImNhFGYaALKgD4VoN93l*HA)A>yiHK z>3tEBBe|<+a-wWVBoR5c?(`?MGnKCWNDOu&&5Q_G&%7-q9=2g65!R~$!>~>r5mrub z_}Xnx%u=q0^+thfYtu5}dF7)NU>@SA$8c)ZjOb-#wsU=39GJq>94drSt?)vEvq<3u z9+i=voCjAdip(J*l^MiH;T6=uy~RSofw z>Nu^(xA=!;d5?_w!0J3@_i_1=YA+g^p_t4;xX^Sd)w-)Uz?|guT%_XTeR$odRs%*< zUVvOA>*M{-xgx90A>%4cV*pwZD-{|~kUM6q5o3I1zJ?(8omH(-L-LgXu- znGA4EeabgQGBu<|5d?Tk7s+ZgP2uct<+!v|hINlUUK))-X5Ow26!VJTu%nVv>0@M1 zRg&R)j-N6?9ApYDXiBX(hOqay=l zwW&U>bYnv4qb+Zs`S$29}I_Og3)BQI%t4KY*TL}NYgf5`UK@4kE@yY+8!og z-GEQEZ%1Tr@(*WDwyssXQ`L;fGmqI0ZBxyWW5Xjnyzlw9!<-Tk(oCf+XbV*_xpcw^ z7Cfyc#E5z94V?}7LkNtfsX&5mc!DbYP`@$QouWb{ZHZxpoR zs*bi@67-Kbu8o;!Nx1DKrAWQRVMD}^O@WO4qEqy0k5+i>G3^AbK0Iq#T;k(U-Xua& z{GF&I>*jGIZiv&hGM-EzvHbX_6q}r1QzJ{wr9Z;rl*xUQeQ}yVnuhasIiQ_i<;R4R zPh1f9GE~-EnIBM-Px;+j6ydCY>6Zlr5g5DuBCx0P_pU(M4<$pQW0w`4aFb$w-3X;l z{OM%~)VDTL*!T1VFlN5T={yai2t$+NAH3Wf2O3;-NPLJNLvCzG=`lJrQtTvgNj3MjY+ z5jQE9TfDttn@QKKh||J6vX0RXpFNfv9co#jI>s0HIUdxve5|jPXW#iinMGV6ov?@} zAkenQf0CikvtOX~$M`H|c*>jrn9aky(S2|oEz7S+iq10EN^E%>f+j3DjEo$3GI&4P zq``FNQWzpxMl>1>Z~MNXn1_6Ldb0U!cm(6tvFnux(??mIgNdz3e^%FSIujvN{So|x zfrbVjS2W<#{!uyB@z3T#ayA|NUPqK}cevP5lBQdN*FD9n9|e0Lg!iFxm^e{euH49J znVA&Ca=52Ih252UB;s@x!c1(BLQTEYj&A?jl&RG(RfTOlle4 zbUy7K&c7F_NrC?Xg#T@h5y!ve7;*d$bBs9tZI03Z<}CP+28I6-6f@BOliUjfE8Ble z#cG<02dzjxIlA#J%I65e0L|nRSVkBSY8DiF$)#zTETkB*PWI*r!0P13>s9h$T#(%~ zNL}G_(bA{)7LCj`j}-5O+aM7o5s8RvED!A*M~V*2SYq-!->h}13Xv2 z!i>l7c_qkT=v6a9_N9RLvK?8d#BscXa6Lj&Hg{IEbZTiPJlR5t(J{AvasACxWE|Oj za>ASu4WtDZpW#ar>RnZ+ohiw0>xvOLKv(V}bFzmtVRKOg(3Ufjzl2PZ@yZfj$wEpB zARU#NiOPbp#fo`PLm`dQ%r1R+FZpw!v95|mx;e9X%HU1z@lRfPc5#4g1L**7`=!c| zCKg1pLf?_yEn+D($(}jofIFc~nFL2Bc%%?l>Up+(EsAVHsuyiJDVyCIv-p^};oB_p z(I#6pAD!mQpRNWq249g#C1_1Ql3*o|iQnurbPdDRR^bht2amWzQ6k~nUF_*viED28 zBt+h@p5}~fIBpx!Tq@DFnYsh2g@pomtqs<3*avN{sybThaAckAN9iSKzYog7Mz_>N z2TjN|lik6f+M3v0_L&VkB-~lb!LIWg37>aNT9Ajyqyn82i3PBP?3RpmXxqyl6T6e# z&j-0KSb?=c~U+0V1dWnywh>Ig~cCI$8FwWXw7 zfdVpxnWJBDf2vNqK7wYNljmNv`;zwpY3n3i{e2~=H|zR9_WkZeZ%===_KTS|7#mvF zLRFo_+WLek*5`Af5s9P1KYTs>K>?jNV_r)i zT!UYXjpx0uzkgAWAw#_VQ&}!;A0!|{d#{Xs`2Z}(0)J34g`FEgDBb;a`DQXXrWlvy zZ=2cs+CiDV2|^ym4V7Cpy7RE9okGUEXRs0%18}Kh7KVcs&cx5+3<{2eeEt2cn54gX zCoLw;v&Q&+mXT7-APYAIr|7Nj7r^ZxW2*>PVpAHFRjIM$Z3@?q8ZwGkUn+ZFRf4+)(qxy_#6S*qt!RaO zbwS)(5srfflt^JTYzTcK2nNi{%wwUlOO1Ydw-zGE^Dr);M=(Z6v3e1g<9JC@UCBh| zp?*N@m;kHzdKKo9BWr_I_qSr|#lDlZ1^)Zu#Ty)1V=*DBXC~11Eb&^wAYkDwtnx>p zs@pHfyFPD2V1dA6X?)|Xuc6j)2be0zvyaYQ>l-!fQrypeRE>_Cv?u zpV*@lrO~-^rr?4l#&r$`;(3PwX~I4AIz(rTB-rq5PFe?ru(SwK z)MWEIEK1_k@bZ4cKbf!UpY#$q%9^q@dMIoll8(glh?B?>kT#;LZR965HjW_ z(Wx-pjpv~afbkibP48vOX>@`653H%ol5Y+QwVphB@$IXg1Mm5Fw}6)quEG*^qv`=h{F>x;={x42seNM z7z*kRpLox=q6-(oPoKGF-A;kNs!;UJx%QMAE=vE@-_9NAraLhH^1%Ay9{&8}QTLZt zQt-mR`L$*Q5MkfIM4ZV9-TesXW?_ZbXYWuL2qMBdD3GpH1>>7_zZrxFzxm={dKXd7 zev*pCJ2G&i#MhQ)n4-mliLVzxPHO4hg2J+8YR}f6Ph8<{#v}Bo*&aA z?sM$p(7I_`4dQ9M3fyB{FfbAzkm4gn4?UNcEzk7ZOr7$Rp7^*BkS)s;%5|6*(_;y> z1``o|K45HfKsrcD>=m=;2@ID4VkXf>1}|FJCatQms!#gGu>&JZC#Od6RRRl0Q;-56zdQ9*d@rs|IXp0iIrSj@#pqnG z_+xu$L|8lw{A?IhV}!$nwlEa8_CC%7%|kD^G+lu~`7uny=5$WLr0y}7GXZzbhUL+$ z?Fn?2h=-PiTf;t2EX>{`6PlwCJd_I7R#3JOoDIgDvrNO`BP_J~buQ$1F1RJV_GEbE z74b%8Dz;g3js?F@aVugk6!&BV#=h)jE(Tf(&*L|qsUTd6Su^yckW$%CCbcv@E&rx` z4I7`UE_NQia)a?&S=ZKS6PJ>9iAq+8`pNc*m2@v*;_k^ z3pXptKVJ)|KXa|9B3qqZ#>@M!3z|yI+1JizpJt_rPGyLexAa1go>(K~OfVCuH7&j( z=yjC2;X~HoDT$&=ksTX4*4kORWMoAxp=D)nDmYm-x__Z$EWEG3e6&)sF5y>hxn^{| zPci6bv4(cNBSDLM@Pc;`%7}UD#a}MjBCx8#h#J`f(T*rDW z27L0X&7@%>y7x}$aIG41Mw*41O+DVa<+b^j1J;SLj@83u^Q30Suy*s#$&j}BSO^$g z!@WfVCEUosMq*&k#~cBIKm8%7O066PmP+W>lt~5vRr+$5&Nm-^bD@SFaqX9`gR)TM#SVJLZ@c*^!l!qH9T&i-_pb8>CxSW(OXSFBp*DyyANXh;h*)Ykh^@6Jw9b@B zn{Ub%=m>W4n|Y~9n}`gh07>|`NVRTqRk>fP-g1};wVwWrYYX(| z&iRoNN_<24+Mu9;FX#MT#(X3D{Q3d8l__T^`Z#j+W^ytp^AeBz!H{96!cy==^H0Y^I(XKR1c8R&FkP!<0UeQ2^z26FsAs|(Jd>Wa^z6D))V36GnG*fYKY zFd4}RKMW+*>QOMmG<$s4D)qiVcP*Sl{)rCR|2-Z4i)k|h{eR}#%)mhZfAHadwfukU zHSz!O;eT66gn@zSpPVGv{^M%Es&q};4OSGtod>EQp0U%(Tc0(}iz2}e6U`MEPqX*j zRSDDHltmW}qaL5o{86#`$$NTru(=dz)Aga_9|Cto;Remy*_I>sePqN zr&~IPNL-tUbGB*WtFzX0o9$R%9UiXt&yV*vK*#7mh%olR%!zW5Q4mijy}a+vpr_H~ zUT6oxFtR>N%d43}SO}&1?kL~g?(){cdjIk&WDz2Oav4I&RIbEk|7k82BD|C^Z5Bm; zdNZ|iYm;};{xan|X@p-+0MXFsCr{CALa}xCA-5PDYBV+oq-!t4nur2{XKDl?ttcdN zF>YS_6mbs@5k|4tEJMH1&$y7L_)hpSAoJm{1cvC}mm(DJsR@J>B9Mv}g%}qyxjdwm z?82hq3qT8}1sIDUM@oHhrHHwi{!MOVat>R8DC5ziZKJs2{K!hDLgL~v#H@y5P}eN} zHp+S5oEh5FI^9vD6ls#-A+Ul?ZL{n#rxZBjKg!Jj5_W^KXL7A`31_q@4`F!;c`oPV zlQFr}`=w5$u8TmWDN3A+lI0+%h>|3N9Hg~P=>)TSWlrRVqjo+&l@VpLps(bk{JLbK z^3nVH>g#>r(z{|$NzyPL=Z*R$*buu41-o?8B|1VD7F-Wwg z=@M<*_G#O;ZQHhO+qP}nw(UM`p0+XPdEW1SbK}mPn27nYD|cm9u8fsYKUVFCUCd`C zz$yQUamphuNO3M-ngA?cl3-#z-hbYL{Tl$|@6nwNc|Hpf_?f_PJpfTqa^s>*Q#Q1h zN)nGpLTn>u>e1Ykwj{KaF!gL|&JY%xPMm}>Jf{~Crk;@glLDtC(w#W{sEJA6s!LTd zt)Ft5F+e#XO_u`r_hHK5kuAVc;0RUH$6!{IqZ6s))fF2~jD$6`Fg$o8AWbzcMVHEw zFrvu%_hqANzgt}~Lx39BRQfMCT`HWC=di><_7!{-gnY8NLZ}Qskq#X|AF=}PCNHqR(BBW0 z{z6&=Qb-@yzM8*B{6|tz*MPCvpX~k^ z1B5{`o*oc$`vI+qPcL==o(KUGtng-g_1l>P;R!>4k@VVuZ2a#;^bo%!u%);&sf((+@RTqPbcBU{yIfd+VjZ9zPe^{!mV*1a zQG<&DQz9Z59DP%CkhNG&iy~*jq(!PN9p!l|JZ-T+5-8fWATf_si80AQL#B#0Npw3I z?#b3tD1?Ki%(*me381u1iE|l)m>C-g)>Sgp(cP158m6OUK<-q~YZ-`5GDBgRki$Ba zFq5QiCvh6a)`IaMFkEXfW0yvTR2mA$;qN}_DuFHe-K>?EF+gKun%5qrwOFuAgGiD~3cNRk>9saWjE=goN@h=|_Jgn_R z7+70OfG1lH^vwrdP?>mlJRl$^`t;r_YzLmKly6+0xrS8Jz*bxi+^O zr{~kX8~tx~y%aAuZ}?x7$~`S=e0Y+~8GjEdW-4iG=hYWSOla-jhEOfEd%8M0JS^o8 z*Or3!V>7Nj)T;7n?Tv;_^@mUbGLR605I>!|O3}9R(NHL$DCN#9UA`Q`VVzUtBWaRi!NVHez$mvT=&E5E!_F5$fndSAXO*3{MU=u23pZ6jd^ zZ;=3}4!1xSZNzPFe}ti~qQ?Ark9pZ+`3b5)?a>=-00?>USKUSvGHiRTK0MLaPb1O&Xkk z+#kRDs?(K$(dJh&7wih-i zxoKTN%1Hb8a(rkZ!=j{cJlugP+tBiII-rSbK8@9ZaJhK}m@?^cOX`0f^YzfXid>nT z~P~Ot(`Ow1*xw`&&J^D8J{}Ch% zjQ>YL!oc*u2oeT{|7$_=zuvB~O z(vgVM>2lbGp7(2?8jiA>1=e>zAP|575nqHKCmfdy#|7B|yps9$Re$nPIqI-{N~+c+ z83fMl95=*;8_85Z>iN3Qv+a9dq5HXO`?>AXdVQ+1>wDX=v%7mPi~D8SJ;ME`WP20l zMcJ0)bW891@Gy+;`}biO!wu7pBFsy!EelD7T*>Z|eX_k>+fRa@Wo296&#QsLS6vn} zj*P;`_3>dC+93~;_qTbAQ38z^i+^!1}ea`9Dv^`k>fE zV_v+70Ds;!O-$iH(5$0-Lw#eHp>T-8oa;`-YxIqZUFFDNsn#(}CZT@)1H%Iyhx?Cp zg8dc-xOy5SImfB`TSbxfLB@Tpjld5V;%|^?XNp6S%03!vizk<;B`~Hzc#m7m5)`|r zrXUZ(-|g${#k-&%XsrGAa~D{*@3}vZZEa4Zr_@{TkUT0P3u@EvYvj5Qoo!nvpjzeu z?Z)KEX(EuM_6OAQ1-{J)e$A-tNR^zaoxySD#nCo88`_QKm3M3!&G-Q)^fsf(15U%# zvFS+xpp?YSwlu|0l+&F#ti7{?!*NKTE#P7O>g36|6qf1_#QNd@R~PtEv<|;$ylhw! z;yo6Pxqc2P-YKUP;4o3jWFUir73Pn|D(P4YrHcY82dep;=aT+!NGh@wGYpq$i4OBSR?%aOm_sz7vM1mnuUEL{TITh!mM&wvqn4Kj0<{kl zNgC`+-m+`H5&4_Nz!sLnfCC?Ia7{I=tHaG(t70i`6Utuvq-vyokig{^ul~*In0nQT z%O1ZyiPJ?q9jA>Vw6cqBM>)!bEMlXPLQR!(iQti`dMs_?V{k=Oz3ac_?FFu(f_+r5YJpIc{*Ihy)S5Z(Hv-iD zQ*`5bx%aZz(QLLRTtJ&;1XoZjs#hplU27kb6e+(L2$>=c@@MM>sS`>6kGYU1$z z2N@eNIs+OfmOM+RX7oUn_=u~tI~mZy3S+m&E#IYNfH!gn>O6ni~~z>4qk;3cUuksp4gG3>||msbx7PE|=S zA)Ek+bx9_h(jIoe^A+yjOb3=^k2Hol+Ec|8)Y>pdAjH%!K)Iq+m;x(^-GM))&ISE9 zG(`;p!)no;67&K;iN_fTFur8v_Sd?;gF=chwKO&=IV#u)30vL;!0y6A?+HP40>ZjCed;( zR2LI4}twx|NgUs`imw*`Y9O zv0^*}4@wM1^F)$x1`Lm5K1K%Nd^|vqyyHhSjKsDD4gsbtbfb!T3%~8eZuGR~*|2yP zob;%4oYDBo-be#EuQgJn6%SKZuFb!X-^o0?ZwWrCe*HLpA>$}EE-P2A(fL(8L-rO@ zZzHy;{I zv8#vl*KWCApi99ZV+6))_TE2}-*Ib`4^w)TK83tsJ8zr$d*we=%l0`~TC#*)Y5AYp zuxlQ1WoWXc$}+HG7s6a1T9%Px!1IHX*kMRFYwLXw(VnB;O$wC< zH)FucL%RGd+t>3$%l6Pg1s(=19*{q6!{KowduvxNI8T+cF7riSbu>?HNnNb&y}~a| zV@H^ddb!SFBBS^{=-irC3$byZ`5#9R?(%-N$buzhh z3J#Fn1{mQ=QD=cd0pqPhaRj$@w(d5!-VttYF`Yf`AezBwU$`JOZUaW{AK00?S=@OG z)(P&&5g=G5vQuB9*#wl=w?dEaRa-i@d2|aGz16B9zYv9Grx+pU0kK?mZ;jmFFST^F zxb=Q7R8^l5fDsK##7-1AAt>*H#vPp6nS0vYdq=R=F=n$depA)>569opy2H@=2`yPA zok~%6h?)Mu@1}}j9O?qqHUW(*IIOetu(|UVjZ{+`5RKlqBwE=Bf93o{!2G^&MgKgN zB6eTmw{~q4V19Y9^RpVV3ObdFRznlAz`v@j3Ss90YU$c%DE@f*r(bk{+bYUbiKfiu zlri@8GxS$~3$OeBr?9_k3IQD~gVIJLyQNXG3p)3xQD5(I%g6(wuS^ev>PULIdO5qY z35pB4_E62<;{D?9H<&s}4KP#??h*wdqG55j0U_omt$+J9phP1yiUgFoSvj=1f^bIb z4w33B^-mQhc1n{F3I(iMWjX;ZhQSVKJi~&$#mCK~x4Qd|$l{$N+EsU{FQ+uAWEn7MU#zPEIXeB@B?D+*({~5F&uMtwHOld|{nPzr^;;+VeZ0?RAZTAWPuCNd z6%z2Zcj-63DV3huCyxn+D6GS~;_`LsF4X)LtX7pOxge(B7Zg(BnEqmb?rXq)Yjq7S z)%X13I0-TlbgG<(8y_4G?N{Zut9&t z5Vluh$I+uWu=fJ8nKLHM+&UC1n5K2GHbM>7xYM(_8Oz5qjH{4-P)xn_)o+EOG+acQ zBeOv<9xQ7RhQzQCMrsO>y>VOSHsk;r7y($FN5HUNw0E49=aLaY*r81J(2S~Y#3=uF zF>1n2#Q8zQ;azGpyOvLI@1aF6OjH*b)(wm)!)P*~!~9--Jd7QT%|XQFBP%i>qk^np zP_a`BlGdcr#%w3gUFlRWJP!V{TQ3*D%Olue{1)sqT6K7{;QY3nH z%a-Biiwb8~o}!|njfD6RDcAs5903`OE54&hb$@3Ae9}`;>>wE&qYVNL58S}vz+$Om z`B=^6<$rra5O6$%)+&BpJav<>6yuK;iyzvr5odp1Im)f|x_lY%=c#nG;aJaAS|w0x z)a~|}^&Urx3siJg>K}yT^@d3hT(1~yL(jQIf+G!oli3g9=*pk z0Jp{iaBdamxvAyVz7_4)+-i6K?5g$eFKZeecaNDH)Ws<)G!zE9Iq0)v36M9(Ca?%f znY0QzP(M$PC0dF~O1TuRNmbc{G#@d?Ooi#*hR;K#{2v44{TS+mRJp6b>K8|A24LZ+#GCZ1 zgXHn~$oUoZuN<#Wagpn0zsBGIJ{#SH?_lcnxdzGoiMdVx5h5NK$d`mY*iERF@lQ@G@!0Mwx0 z)Pc+NiF1Hr@HmXQYKnFCp3(JKt6#%VTejwQiiX1PJu{_e7~6CrRi{qO0{jAKvVkaU zq3YASbJ125)!_RL!f}|UX@jQk4 z^g~@iTkl^>)afi9#v!IRxZ)>&ji86+@ZPz7I5?lxU*iCdZr8Gnoc#KW2?*QWgWJmv zsOjV)-<#2~R=E*2(Mm2SmnZ?4nP**35nrr8Z&Wu6{$Wq>San~M%%dtVbD)tF1Qu?K zRS&LJILRE;AQMTac9w)R51m-HR3EW~FGD5})j)C~+(fa}JgkldnPj=LZ@lJEGf+BT ztyT6Ny};b%CC}&&RtVx*ywu8L#T|=cQk1sy!i3dfhazK47#{utls$*&E@MYHOdC;l_}E!Yn`2m{LQU%Zv*J zG|x-zr;gNFMnkS=L)k`?cT&YC3-MGoml-1)N#P<=MCej(i@qoa7!S297m+V|lq`S| z?^{$JFq+mX@`vO0c2M!~;JtDcv;d>TX#Cz_b-EQ(Xg97nID$1cegOgcHGeq4>gnVMziS zuAJADYPjaQpx;xJN6~$t25@L<#Sw^@Bm{1YiwLAx!R4>%pYbnUh>?L_Ej(8v#78h) zYI$yCpPG$sbPWg<(38DSUb%QQQWbz`)PMdQWsETs8OW3fKvNMd&U3DtU68M@L|+aQY|OP(AfLx!vk(xt2BC;% z7G7SN=9RYLF%GqXtweitMiyUJ$gh+K^gmYn!!wwIqVKPD)e6+jx#<$&B@ zn!+KVTj!7)_>*KAay%`Kc1%Xm>>$Aph7X2>h^eKQ4zhJO*O0or8Hx%!+q zb(B3h0t^%}jC`|vASrO6SuZ@1%%v^@IA_kE(g&QY1VMG!oHSdx&jQBf=cOK>Vu<@B&B# ziu(#lVv2k{&uW+WR7AM^RvwZ3tQP@(ftkp%!PmkVcXu;s5Tb!f8R<>{fLw^=1%jbkElcf0<44KIaWexz250-BgACzApI zQRIGoSa3uMW{@!IBZQ4IUv_)5Qj<#R8$#Kl%XtKKg?fm7PzTN2e7Db6w3mud`~&}r zq-o?E?Eoobrgn%x*`-{vEwX)7Sor`+qm;OX2R&rf{YaCkfSY4TK^jjYMuKsKLnS2B zc8ju0nNihxYZ3<9j@bGF#Qb7WWix(=m$h|wZL2?H&)59X*AEg z6c&Yeer@hKme;N2+!=b@7~^ubzhhBW zT2c4Y+L|}pWyIoGnyn`HRTd3j6hStnoxz~6C@~W9D-Lx$*t%)NAIJbS;VwNYKRL+S z;Q*A0<`m!Q?6&L*Gr+livoZ4IaMpUC5-Yb5Dohs#>m4lysI?v07@OENeKuAKzP?s? zYZy2tiBVFuK~p84=6T5ixkvN_wW2txGJ8k9E8bbj0C<2OHK!Q4#LeqyFt{92`(uss zN;nBlAUM$)cZX3Tji+)OWn#f4%!w2&!auO3Nwn04A!MNWM|nPFh>9YMbe;zo!mC*J zEI!^FTp*p;y1@UUP{u4E*5bsj9<4fyQCMdFi5#(#Y9mrV@#&(l`dauYk#G#N}+nACW;HggU4T*s?Om6wtBY zW)iSv@Wkrb^6{y|+|<&lVU0YU41TgQ{gcqNtFkL{BC*d1fd8&Q4p=Oua`6%^b0$Z0 znVy3Kku7|SVR z!ZOiK0T(An+nj|J^5T|tBYRN965))8He(2YB#)_#ofU;xov?C(;EOYxslqAO(8#1P z@h+nhW|b+rXmRyG3w3*e|`hrD44G&E3=k6(A9EOV$$tlgMi;G+_3C0~<#Bh-f+Et#| zQt$&VQk&cx4OwH`Y*sy+Ju3wt>Z(U2_t*nE#F$(Io~x*{kr9j{og9ISc&sbqIk-}= z1DInFdr8V|6GavjfFakD9U={z#}1HLy`YQVlbTm0OPNs-f6*8E**6v`l4@iU~nv zN+=WHa4FouO~cwSpp|iiHhw$jnwos#SfNES4Ajb5>$|f&*&qL?EU2q@eg`tpN7t%V zMNCwFU=FC;Ua;bN0*x97FS^AlV z3{37xeI{XWuyk5R_xb1m>~+2X6VwhPyu}=>&CUdTU2I|5U}IYZtaDiwoJgV})Vg&n z$XHK+4$r>sbbK@0G{VDrKL8`Eg` zeix59#DK6@aHII%ZuHOLGT@+U<7wfU&F0%m3|5_Zuu)~`cPhV?Y+aNfkeAB2DvYjV zG)P>|Mo*I0Dh&W5DGQ;TNQA^>!u!>wLrkLi(_AyzQ)0Xq=IL>Q`}sfF&I0;S@Wqn~ z9s!j37m7HP17KbwA#>bA3!Tb@1cTX_g-G*+$$7vmQ{=E*MI2xYbZG=97#onOmKpxQ zwvVisRO}jMKRQE5ZT-nupxUWK_6}N6Ey(+`Zi9Pu^1DhP%;9{(m%x^_;jHk+7z7ME zgsIsmAl*3Hsp={=2uGy0vt7X?0amt#NLJW?lvckI=ui~JEl{f=f8HjN=qf`Z38Zxv zBgC3W`A3agLzpsS5JjMJ!KgelQiUJ z2vQ^A27pnO6w|U$pdbaXit_m~Bw%8>WAD7<-e;4$8S+y%fKWMdT6$HFKmiouWGb^r zq{U5HjbE7;6gs&J(t`JgUO#F5(pi%~5AaveeoDlICvUNQD_s-6^1Us^jX2)=T$QAtivNw2Zok> z82#dcOL_L_5HZcVqqP9@G38&`Fr*3FA#GJNAL4jdN9h|WP!mrY_&Q$SqEU4%)_+<)2T>{P__E!+wL zP$8gWccC0#d%{C(osQo)U(!t{vp%fq(&Oq$fxu_q5PsS)vtIS`pg?7w5&=1dL5Pxz ze+E=qOrY#pXeq#A@l~cNffR(Fs9P8;)`bofV|*r9JM@j}F5(I~0HSu5{GxL1ML50H z(Sg6JLyOBA$|+dAadO>_%VR|n(6yjoHMcO8CISDhawuGRl5`3;3Cre#Uea{=@fA46 z1=$Ux>g1YILZ%Z8x~|nWwwDv=`shjqoN|v@le8?zC^&SyHc$MeT(KW z8CD?l0*K&}eioW=jjgb1zG@YrZO6XltWYy1`uQf|+_ei7Hq`A-I4y;$l2N^exhgb& zmEk&av+*Ni2!H7g1!(yyb(AOgK>+5JzbS(@gVvEIjj6o1Vn@$~(_W&51ckU}JbhoV zBVR%k(VT(KaWObdjZ?6=EroiJ|8QD|mX~8hgLDwp8YP-FBh82xBZIZ006iFG{gE}P z1t1a1;@P2~h&Utr>>d#Y###dABVzb-CM{5`l_zt_vc9sLte5Gsj5dIW>(#XAZ|I87 ztVC5YZ?_8+xYi>_(sj@U)AYO*e=PQ213V(JXr+-yX|+Q{Li&`IhomsP0c1d=qG>>h z7e<>;TM+j!O)E|LFCaO$C0XR#Xu3hXyb)$!!^|9np%irSN$f$^;`#v zvzDXZoV-aIr#iCcJk6{Dw*a)rIi&?)`IXMl`mG@fWes>kP^b*GU{PB5?1+QPE}Pu) zsH+jamDuId zVBsihyf--QrCj6~(*$@{L(RqJX8()`k{e330eR5~0THC;Rg9_F<~#7)h=p+pa~xii zWH^_i1u|AoJl92XO+yo57e?Ej%(dFyScSbVVOZL25r4f9@BR*KPPg4u4 z>JN;OVGG*M+O|)AWzZp6xq)@^*5C`!I^iOtcolI?ao!rO?UAeiiI*nUXkr5Kvu;DV ztkKiJ7L%)QHA50Rf;*m%%0P8gD|ZFEqWg0BDbjdA6>zB#+}J;8{yN5k*OWc*4bVMsD?^4RurIMke=wVoU7TIHp8XzW*9$!Rg}3t?&N<7O9u#e{Ki`3Hi6jlE+LXv7yF_4eTIm#0 zTc%E=G*qy{0zmvnmbHC)vNPoOe)FU2L5nq3u7_zwMy^q46(!>#9%av9vvPBBn_huG zhVT`tUYT$I9q!yR#-Hnf=&YMXMn=cLm=ORl6SKO|>Blkun&qfJ3a!n_P@$5}o%{Pt z`l{T>u?Di2jIAR40O=JYFgE;^>G|X@76M*he5}8eUKpF=anq8vFcP{LXf)Cye>s>% zI1gx_?GHl`sn*LTMFnXhG>u%NG+AJkoCqcd);JXwSQVU|M=E5w;&BZP{uxMTGMJ$> zP2a2-LQ4XI;+CI<87M?YIfjK!-T5)x2l<_&fCeJz>y>I5$ociueyYHaw{0k$j7FKDdiAyvgo`L)5Z<$;`lB`Mq zG+7JuiY!|33lBfyPp11Ygbc- z*=*D(dDqv4o=pg%pMc^<9e@4`eG3}oy^Pw%Yp_iu;7#W<#y))ML_}c0=;*Qe={4Z8 zc?%pEH)*LO7!jV(xYcsi>`1TK**G#q&4C9I-# zkHqGLU;$GaqAt1z6r?65eJiI(u|{PS(^L{UB?aRXAQb3e)LOVx@bP6v;N75IV}4S! zp#koM(T?)k_$uVwLq(7M>{M-qZ2%*C?|I%KMnNnX{%pfsH1Wy%<_%?_g%T)RJd7;; zmh^|@j^j!?wG&!+>(&`wWji0Ta{H zX#$K)4jmYfndA8O_z#5{z>U~RMhqW-j!*$UyA=ySszzsMQ(Rb>zv z_r`|EaHD%wf?Fy=^nO=Gg8}&(ZPfT#knOUiOXn^!)0_2=P6o!P zY}rWYhz~*&43CtwagNT_ygm!He!@)2ci2LlsQrcaR9>NC%sc`q z`pJk^qhT}KIJpb{%WQv~@@tJT<2I8HHcw1XaNX#RS7t{Ace@>le-1)H$>KSRqU3J` zawQVrGnUfwJ(Ob;ShJvU2S1 z;#s-WM9j^xxI{6zR{>*eFbO93L+D_4;bhAuHe|YD1Fr+k2mP1AL`!-&evcdw!KA{UmtO<@it5jyjTssRWqxPzn$A+qnTK z%#M+Wp$JeQUgpm)xWpr%G?x%iIv22&mdzLBdv|jRM>>wwERlwNm!zRX5EKUkEdck+ zTe{(NlLTQKS}yb~--xxleAEb{Y7pB{po1WXtBxB{?mgjxTvy^f1iTC5x(#vX$wuL9 zCLQvFqV^#9Xlfd0m`zY13x%N(s1n=cSe0eBe-9B=FxriovD;mNPQNENhO{4opcB4Q zU!Z!U^JK)tX^K329|>fxQxmobM+!nL=TkLgtYrpFeQZeGm#XtLAWC64$VUQ&+-7K_ z8fLOEQWWKYBZ~kX zAHJrg+OgVHWQAE-HzlLIWDzQVtDreB&VSV%#9&Ev(Wvc*>9kZy%5+)u1eJH* zslwbmdb`CSk**OfkYNOQt=61P=)^-bNO~rIqGBwF4Ivyb-8bp=pf=DvC- zyS4az78e-VU6fYM4>KQl@O_AJ0Z3GMRD-5ZzXS5%&4@*1eB5Yd*=i6iBB25%HGSs+GJ(g@zQVHt4VQR6#$syt7*P?>VAMVm=zvg| zMnZFG5VTNS1$PMe*zlg}fE^2R6o}!TCsdHz0CywagPUqdid_+%9C%OzB{r-WAE+Y$ zt!^FxirBcFK;w{@;sE@>AZ)m&i#K#k&?Z^GEHcTF$tET%i|mLpZH*4x*&slSIe+t< zRYtAI^39YDF;o{`@d0ol@60j}4$0-kpAEQ%@8FN3-JRp$IK46g>MB;A+tEo4D&cXV{M=_bBxC2)VR9gZaKZlQ)WbJf zu(p2rh>gIgn*JBV>_Qgg+(PzRrie6H$Z5>WE^2&&%jmSTmL-ZrioKv_(Wf?UG0~u0 zY~>x|3X~<19RHRx?v~{6c{hqUi=lxKtWW^Lk>!!UEg+K$%(UrMy;E1n9INA?o60&7 zpywH+&F>!I&tTYuJB=J2^7?`w^5F%JgTMn4Z}enC*L;Tf%yb>T*V}5zZS#vP(D~xu z@W$?>I&^oqh1pyqi$p6;is5P={@p8cTf2*Qvf6_@`$Jlp;Vd?G5=b@E8c2GP=on|z zI-7ns)Gj9#;b*>p(nd{pYkmf0Nd5xhLH)}-7I{pA%^c&ZHdLW1N_}ghZ{J)mwj^*jL_lw!ll_D?tV}Q z^w7Ubs#p-q(HfPW{sTe@!7BwA)VgpA1ZX^4!B0cYlB_`ak}fIZu1b6H}`|r2>VV`^eF4FTRZGaLXP$AS$dUy0R4dCw@B*Zsrkyb zc(2Az<;Z~&j~lKcMzek){)1Rw$n^e1a~Ca=sq@^3VeG9o*m0B>Z4d{_t+uPnklj)z zos2fG4Zdgw{{n7W!n9B6A!Fj(E@bdTEMgy>lwD-()V_?3`PVZRgR!fsqX#waWp zC#`Qi0hYyWZ_EcxP{%+$foO9&YyrLOSjY=#+v#Fg$p}nXnHO!(Aw5>E)F0RLlw7Ho z>gH5A<1ZI>x$~mSK-!GU#jX$wD1YZp+8j6zRI9eBtjYKt9O6#e9<9KAVHTb6fM0gG zZ_YYb_*k`4cBvI5hgRL5Qkd&mB)}~3l@CA~g$NE+T(sP0JH{SgYsDCjX>EstS61w_ z^3W&k%%kNy4jZ79_BbBY@&sY0gJd|NJn%D1#j$hK-k!8EW%ak(p7p>3v3mp%50BcMak2*; z^l=fnQJPp=4(HPsZet?Sg$|sw%mrs%R~MYy@0&MLW2m<6bkd5YABA)Bx!=&pH0OQv zkV$YbPRwnaf^EPD$&v8`NWTHpU&Sa*r>tsZyBHo4kNp%YkEgnslH#I;)hIpq+^3riimyW2vH`1bvAVIB&lrt?T{cws!&ij zh&0bi5aYNqPwPdDGGfs7D`pK73OZvOD2hM%-55%I(^b4zU=ReNS-?kJ9{Ch16 zU8+#1{1OGx*ihj(RstusHGdDMNv`e5X7lT&#_@O8 z18?Ai;_BSI7L3Fq!h&Maxx)_Gm~#tA3NpR!2!{Z$+m7TEwe*uQ!*3_&(2|q*wvs0= z-3b2{O+vg-wUKqxXy@xhKmnwQNxAXo8 zo@!+1RJfCH4dxdzLedFthN;%%t4XPYAhL`Sqp@h@U6bt6AFOe^mD`e3@tZhTR0jTO z(Qd0{EI)s7X!jNoUk}Q?uiPl0m3+DW>ux#D=1#r%Yei|6BS1)9@A3 zO+qSQbCPidUH!$qMNVNp=fqEb)l&-+KV!0Whbv9hfW}|2#$HjA)ASVi8q^$!HB5GuecZb@#mBY!cP3G(w~_s%J1QAjXR}r|(dx z!@7*B;qdha=jXpeO{M1QRTG{LeSmsA$PkqFCzK|3DJ*pSf~qRVicm2smdT?K|RZ@lGZ-q7%8Rd|C|hd8iyD*-fNS_ zqMm7MFsX2aFTEtq1iPPek`wy-N$ zITFQighvI+_}%`jiapK68(PYhul}y-_yE_Ezr{1OqV8+WYKrE`pR?zW5bhB>6mdWA z=Z{bjdvl}AE@Wy;*Exlvdh8cB!oo)XCaD2RQ;JZ8{#@84hxw5B@@Z)sKnueJV7+7O zT_=6)ye%D3r0;d6>k$!guAdrys{jrx7aV8FR7#CUsQ5kF&_4j}&=(@nPo(Y!~u zz!|(>YF8K#t}~zp%=B@WFx(}*8Zrs3tYB3jZncv$H!YP2#H(uDbut=--)V#ZV{r<1 zfyuWvt~T>{E98b?EQMA3_Sso>jekenKsN6vs?|JgPK?n==$rxQK=_^3YPZorEH=9Z zPyfe0l?a%UJ6uvYzk$_m#&Rp^1tizs$qudH|4IJb_8EApjxwnn$BgTvFw8iGPvjqT6Zng6pJdmTds9X3sgmpX7%zk# zCX~8|)Gj(xz11y&bg{;*@51HBmfPB-A*HdhhACzvj(nS5X z&n?Dcu1F39AmMsRSA!i4k^||(1aeZJit~DO6HpBXl^B#Vru~kVH>wKnkLKp@E=LVm z8{jJnsDARUa3_o|zbi34Wv6o}@F;gX4w2d1TyECLz@V#A3Q{eT^;Ym@CO`1WZ4i4- z04LC6*4JpYLIf|`yMRq@BAmgu>mrA=QeX{=>aE{zq|)o0%k=E?V9XIKaj5wW?wp?x zFj?OzS6)5R4(+WmZm%at~gjt2-KSssuTS|vfKky=;=-JJ&$55 zTSSLe#0c}ltC8+f7}Q`zG(SnPL!CuFF1r{&^Ma4L-wIvtzPG0ZGM*!pDP1;h&}w0i zh7KcHO2*tfE0yVC>=nAR3PDI&GmN!tNbI?#;w+eafq`2E#q>2;c4<=6{2rj&9qaUn z;o0JRE)VsZFf#|H^j7AJYu$tmT)1L!74kl(#H)7a$^N!9tJtqf5qI0F#(>SacpI?g zz_?5De3!ML=4-fXX{1Hz1uYcwt!-qayFjuU?MOZW8*F^KV35t`UCwhDJfliw7gHTJJa|wavVwuvhmA&#cnN0j2VvG$_Z&@}WA6n~*yb>&a5n5;FC+Cw#2X~bZ5dAs7|!2;em#+qNR z=QKt&YhS|;ziiOq-1Lgj=gNb_bib#h7X=_FY92+R-#GJ9erM)vFBTq%jCv8*p z3N(wO_Sz*->diktEy@DT%W3`u2)LYR^HNHVE&n;VLJDJ`<(JsW(en~BkHc12oME-yN{MKu8#9PP!qiiD zDewabLz>sP`gPcO{K}Ai7D+iuK&B}fX|!3~gH#5GnL(f{%niq2od}I^%7vCz>HzIJ zD@`l*iv)Hc-~QJgD7PT5R{ONS7mz&?@NtmB29;X)yjGl1985)6Xf`IPoBy}EljBz0 z!?NTw&X`6jl!FprL&5b=ztO?7v|JC*L@=!)OSyhVq%2~xf3XiSR3h8T$jcdRa4Yvy zyOb=_%F)qoDdQtLX}TqhOiPbF;}+N84M6;aZXj0aD08-kd-4_PSL$qnpgYu)ES zy5zuEms#4yGn0Yx80OwA~V#c3a3)!jJ~RLNGyw+bq^4bh|3+$a??rs>-N zYj`mxG!xNNY!`S(MV&+`6@tMIy0I%dD6%GuTid`KTTz=cQx%T2DN_VOg^9DKgtT^( zXh3?iU8-J_En6L`4R6OAK5Ochl7xh`UX+&T)NlWTsc(wTvx~7WiH7s)Nm5DHlwRv2J#o9xjfH1+d$3MiIMvo**k`&?giI;U*3RO5eznobYs=dT z8Cp4x0G>(W+04z{f5lOutv%{PHHdji*$>D(Tm0ol^SQt}Tb)CLQ@zt?J5joVc*ndb z``1EI-Pr=+uaOxhN#4$dUsts-(%STnG zpB=5f%D+0Vhn62DOQ&w2JJ~_Pz}Rya1)^rgZ7u)Ijxizy$lYZ2mY`qrCG=QxoMDL0 z?nlU(<0lp#D%H#(OH>OowUTNNLl%mu8wyl*s@9&QG9S5RkM_0Q_|{9S``gHJ0ux!! zs?nW4e=vi|zsW(jyvEfT_?aAN$C{*6BOB+#m~@hF+9yx|;z zRKn)t>JbU4%%-ENR2^Y@y7uHa(ZYrmN*-di@*dT{%UrW1;e~VoN}!M4mKLTGi7Yu0qmn8kFTM zIe;+p(WCmq&ijh9LQ3z?`FtAFKna14hngL4Cp6R3sZ|DfySpR<8eN31tm|L``{5ej zbuM7FXjUt32V2?qV!jK8Y}@luR@FC*pQ<XFnuP`O`HrEZi&5 z8DF%4niKVFuXdC8L|d&RSm;a}Nxq_*vpJN7`#47${kM>+FNNCN7OFy7jAZRa7}I#L zC{z9@zO{Gre6_PYO_g%|&JYWY1T7HrE^>ZB2uAs2#-!2V2!X}`nnl&5jZHh#6~xPhZX2PoNVXq=9E|UNNgurfcGMiP zSY94pAtGXz`Ce2Tt-_Gx=zNOC3WSAr!>?ixFocJ&rX^8< z2Kff5^(HN2N)en|ovdAdo)hu%!X}bDC4U3J5+?h_q`KUtN>Vr$xt8^1XNpUJ!m!#P zFh{`@&rK=55sD0CgS$BMe#&!^0^2gi&m zyX{UgA09PFpCG2jyWMd=vkt!e_F|$ZUyx9H&WDmBAxQP6#)?=49vW&9-vA=`41t20 zX+SI}axFl2X`B(K)ft{jHBt83gx`nlpN@8Gm` zdJsLv$cZ@Z4uZ`g`=UZr#$tTi3AOx2D!CMkOk(Qbb*kEyKizr;>Yd3`jkak9Srh{| zeCUq#IvjcHAJ=2S1uyTO2%&Sxgr&(n6QyFMc`8)@smB`Ic;{_5aDOS%+`R_vr?$6|OYifzOW+SJHy2LFwhsSER_dro{~qJOfVNlCf7GckUBF@R>r=HG2&IpF}Ve}xTn2J5`} zxyIe8^IQR>RDGIGP@Tb6JTDHdntrm%_PEaA~+gP*q5%9~1{0C~!7jT~RG! zqHXoUPLL*WDl$D2;prQ44#zT6J!}~8y=qV?jaeB9p-M+FY*=F`8EvKt9di_lhoHKD zJfuf%cA4`qDbT$vYkn8iCgk!Eh2K6wuO>r^(C-kEnsFkhyBp-R&5HbKv??p6QE+Ep zwuo07qNqb>^r=G?z)`FO9fC`*_xK^eZZS%Y9BbZ7(nvW@QNoaEFeS&LrwwzIuZh?? z?}D&aGdJ_+8O~x}0LMJ&ngnf4yPmBW}MqDP?tey;6v4lBmF7bjvra1+T*R@a^ zp&bq*b;(zDJq!dwCp3ckIwnem7D30Lwe8H}2%5`dq`6vYbW<|rmQDxHk$Ti*{ic3t zmm!zEiT;Ad{=;{q&br?3Vb7%uX)W?5@n`ulY}=*B{>5YOHt03~^&lEzRLR^4gkP#* zMBObY=w|O6GamLAhQL0ePe~(H8~=-A?|0R4cSLw%!Lk^`C{ z8C>+JquWgZ;;2#S6GuU}JVak4W#M^*Jp*w|7mB~tj8YhU?G3>lAol83FJe!xk2o?I z!}l0{DuGshEBxM_uqw-@kDvplaMrpEJV?ZyopETfk6%n0$QlZY+LGc(o9c&A$}?Yf z1vgL_u!$a>o=$789*uptRJm2ZEYws;F$}MaP*d6oCV@@c&(z35Q=_9G`8`SD=h_=C z7>7x&rt~~0J%yZ0Zbu95;kYkKh#0{wmARI5NG)rKhp6L#o4Me>OE4duAq6xr9NsJ4 zicz*PLORAZnbelZr%`M-9kvPs#=;LL@Bp*nTV}6Is%Ump*<`()dp~|&3EbqONX|kz zJ=kS-Y=-!NI?V(boYcfy>yb3eAoUUX^OOt^`Q?vOFzH57*>FU! zlsY^!;E06nJt2NPWUfFqHeuW0A^@g?y-TU0?iOuEpCQMm0tHS37@OO;nggK#73W?= zyfn$}q`@>B2BH7yoFP~Jhci5x19;W+m``>Qu0>u~zI+fic`vKhp{F5Ja~S4bHi6!86pm;5F$jN%uH0Vl{u55X-sj99yWx!g6pM z3-RHvlam*J(}Ej;2$BtPs?qMYI)s zxQQhhP;$^;nG8YT51nv5(FNL|y06bcf$8O%IaLz$3lPt-wTRa_aG;w0c%0Ne1KY%@ z3eOLNApkdQEcVIP_D=()X8|#j5jlzpa(=k7G7(z?YO9$!(uJ0GGi^Cx*yFZQ1~^hI zWofQcLs-9p51QrFvwjN;5V`TEE(dRYNi<*{wh}Ho(s|1*m-SqY9km{0UZ|kca@YbV z4$c|f85Ib?nfn1X_1Y9O_V1>9Oe*Tn|0WijW-C-$8*|1vq$?^s2AWE;_ckTe;y z;8e5h8NE)_#1f!Ca#>uHb|Am=3U%7mR}J-xRzY^+c-9IsIe^vKSCM_q_JEtZj{38O zb$or=xnXC&=RvYR_`fsJ;`rti|;aKW;X5w9h{U__FMZJO#w#x(u z7?UGMTB&oHQyZ%U)eAkQA#`L#!(!=74<(D(SNVvy>Y~7|kR)1Ej`-K~Iz_W1=oM!p zfP-xg2u#4Dh*yGy1c1n_D6|@rZ<+51>KuHQylq>!9!hF~`q$C`$3p+sjXeKQa&xvb zT~P2PQC%JQ%2Xmqz6bIpP3o7k>gRf_X>4fY1FXs#&;$;sWd+8o&z&7$AE1BVqxFd^ z%X+8u&5b5$_hyH$QAzpjBX^hb%3dpY5A*Ap8W%0^L+rx9iR!x59}OIi2DEy2=l-+@ zibXWvHTDXd6*d}=rFVu@5w||@>8(=u?luMh{buXK2Io4Jm*Q{u*)>MBIk!JNY1;Fe z5%n;Q$AezaH_vzN9OE*!awb6@lzk*PBi&%DZVmfr$xYlbgq%g zo^ZMf!b0qZPjnMUrY#iZ$gm@I?;w9j1Y%dhvB_wh7}QY}p21|4fs{ zV45UeT%4{dlg8{dCTyHg6D9$SiBRS;O_C^x2&J15SP91^uQSj@V~GqJ9M2{hjCi3! z*uKK&Fd4RNPOM)_0*N<J(A9*Kkn=!WN;ZYY)Up1;B_!c2{0%1vMd!#92-- zCg$mg1=h*aF`@-DILQT_qtVbKE=Y62WLrk+jIJ&^&EIYVF;F@iCT{KDH3|S_P{)cWFX=9Tib*|2v z(KF&E+C>T&@HTvqQ%h=ZvhOaLZq71r8gCdiTPDMopnO7lHcC5`^a9ug+Pa!_bfp|H?`Ot@`Y zfa#1ZlVTu}U0EO#J}_n$brf7WbZ6ls;xzcTzS})w!0$;De*(kx_Q=0$Xj6rP6X9Ak zVh*(s3@Rg%glZ3qzd>Ci=MMfiSDn=S^>V8k00nb^c$OPIRoCMacGA) zPlMy?6K)y=&O?MrssrxDC*=TrMa!kE&B}dSP%lCf(%`S@5pFu9c8yoP;r0Q9^F{!l z`@1jDU?q7blqcbvcVXQ_!VEQHf?#1?ZJS@(Ojxwc>(9V&yAM9+#P)akfz@5LJY^+9o{Y9 z#QJX-cqGE3x9bptb!m_0xw-Y*ohAgr5};f5{j<~wQ?t%JL9&7aw+dW^`6QeuBHQA4 z7z!jmq8_w-7>d3MCu<|SgS8oQTz^HL)<%QECi~MvNc3+M7!h-z=xzPc;{azy|JOV6 zv0s@;)6=M#FZzG5raFikURkxQLhbC?M(59R*<(pM=f}r|*&t{DU$sIy=K9)-))LC_ zX18VjXig$57K;)4bO^oX?(n8n^UQ{1fQ3+*eB$=jJ%+pd8QFon?LrG9f9{7x;6f2B z9%0iOV90_b3ylIT=N?&ca_1Ri zRJ4~xvht&Wpt_vP+-wg=Q|uhIZ?NTbSc@{*O8s2`k~!IOAiE#u4$0a@E1o}0R9RPoubR}NMWO4hDTmT>m;2P8#Mg|r3La<5aDkS&=;Ss6U}c& z5`}s2WLWYsy)-wJTvzT@*k#I2G_#cn$u3rsNXI5N{%2vjwts}AA~KLZTU``|9_9K2 zVfTtf%w@kXh$L^G2-UM*qi917zs#Mbk~&+|m;;u&TP^G!lX;3fe-%G3xM67#Jc?7@ zA`BY$fK{o*WB>ef-rcSR1R{<}Yq1%a9Y^!Q11D&tHzS)Ozn~dbWXXY&oYXafZ8M^I z4EV{yFkqzkp}Rb6dIt^xvHWh>4PK4Im*%5!!va|;^OE}IRAHiswpa~@#?kC>y!pp# zH$w>YPVM*ss^qu7v=v8mG4-|<$hl)hhJUun_TzR6KIlp2Uut-PDR=sql+z#+%N13y zsl_V%n3w?8s=b0goRJQzEA)>GIa9(Wrl5_jXiRUZbO%Ov;_dCvd$R?#6j+}#GAf5Y zEhv#V{o2OK!d9DOn3_BCclWMVULaV>Z=g9J_7fEwylU^jj1(b}zX^rE9ecqnuBm1(S3QVqe;+=*n`~fB6$Dt&-EyCEWW5MR{_SP?SNp)0(X!&Nb4gaWX-wF*yQeC?2eivXEe{rSU8&s;ft9& z^9Vje#Y~790GeVCx|0Z8?J^Y!V0o>0OGMzJ@;;@m9{;-d1@BRNg1E-})Gr!!b|t2M zkEavG(pm_9{)46PLOGY!E=Kk1F^75VfeQaKURL6fAS*Fu5JM5cBgqQq&jiz2w_4S` zWs)OQZ(JEc^U^yrir%C{@w-g*P6KgNN~n)|n8A}UV=&l^hP(ql*+QnTUV37HA#urx zM1>H9xdD9&Nnv^t=E~&nLPymBI#;f=!C9m62?ul!53!+zeY81ebU!M|>pv|ClYC-N zus4yCgBXc_^A9`mp82&s{iplKBMVISzJCoQ-*TeaMq_RJBY@%tV!pQL`j}v1u56(l zjUEx=jX7w?4*N3G9Mp!-Jxsx*h~2SqQyScb=G@Rlb$+e=wr%>*WUsV7`Ff&l=qttq zO-O*1Hmnl=D?mqkVx1KX_s)B=9EE2@8-}RgxGHmh3z{q8n zlwe(RySi&Cj456E8k{UH#6z0E;Zz?AF$+|%7sL0vV%!5Fbs(nuuDKZ|syOi62m@B$ z3{~7R==kxMU_xqS6p1Y$NLQ4vK12KhAj}U*1p!WHNk$Lk8R`xanX%rJPFN59CYyM7~lk!M@ti%&<e|(9Aoj^Gx9TAlBlD%EFi7ObR}=<@rmkTEykv)_<~#X~lA|y&s){Y6wkd${Do0aB z14h}VH6)ZQA}bN^nIl3WGXoYLFB2jQunngf2cL=420cFgKx(_LV+fD1o-%@|nT7cN z1+R2LlQ@WR*NZ(aw(=+?E=2g;PDjoMqL#QR?`r3&nE|HY{ZQ1rGFVFJ_A?==$E
A7s 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

5R08 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

)a?&J9~ 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 *$HvP-yV!V#7E?E?w3{j?$X_>C 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%0Ad7+LINN3An%cumDklF!|+%Cg#%D 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�Op7DZvt4rlJ1Xt(or2mdhcw&K-lp@c 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 #include #include +#include +#include #include #define local static -/* special data types */ -typedef unsigned long long big_t; /* type for code counting */ -typedef unsigned long long code_t; /* type for bit pattern counting */ -struct tab { /* type for been here check */ - size_t len; /* length of bit vector in char's */ - char *vec; /* allocated bit vector */ +// Special data types. +typedef uintmax_t big_t; // type for code counting +#define PRIbig "ju" // printf format for big_t +typedef uintmax_t code_t; // type for bit pattern counting +struct tab { // type for been-here check + size_t len; // allocated length of bit vector in octets + char *vec; // allocated bit vector }; /* The array for saving results, num[], is indexed with this triplet: @@ -126,447 +132,466 @@ struct tab { /* type for been here check */ left: 2..syms - 1, but only the evens (so syms == 8 -> 2, 4, 6) len: 1..max - 1 (max == maximum code length in bits) - syms == 2 is not saved since that immediately leads to a single code. left + syms == 2 is not saved since that immediately leads to a single code. left must be even, since it represents the number of available bit patterns at - the current length, which is double the number at the previous length. - left ends at syms-1 since left == syms immediately results in a single code. + the current length, which is double the number at the previous length. left + ends at syms-1 since left == syms immediately results in a single code. (left > sym is not allowed since that would result in an incomplete code.) len is less than max, since the code completes immediately when len == max. - The offset into the array is calculated for the three indices with the - first one (syms) being outermost, and the last one (len) being innermost. - We build the array with length max-1 lists for the len index, with syms-3 - of those for each symbol. There are totsym-2 of those, with each one - varying in length as a function of sym. See the calculation of index in - count() for the index, and the calculation of size in main() for the size - of the array. + The offset into the array is calculated for the three indices with the first + one (syms) being outermost, and the last one (len) being innermost. We build + the array with length max-1 lists for the len index, with syms-3 of those + for each symbol. There are totsym-2 of those, with each one varying in + length as a function of sym. See the calculation of index in map() for the + index, and the calculation of size in main() for the size of the array. For the deflate example of 286 symbols limited to 15-bit codes, the array - has 284,284 entries, taking up 2.17 MB for an 8-byte big_t. More than - half of the space allocated for saved results is actually used -- not all - possible triplets are reached in the generation of valid Huffman codes. + has 284,284 entries, taking up 2.17 MB for an 8-byte big_t. More than half + of the space allocated for saved results is actually used -- not all + possible triplets are reached in the generation of valid prefix codes. */ /* The array for tracking visited states, done[], is itself indexed identically to the num[] array as described above for the (syms, left, len) triplet. Each element in the array is further indexed by the (mem, rem) doublet, where mem is the amount of inflate table space used so far, and rem is the - remaining unused entries in the current inflate sub-table. Each indexed + remaining unused entries in the current inflate sub-table. Each indexed element is simply one bit indicating whether the state has been visited or - not. Since the ranges for mem and rem are not known a priori, each bit + not. Since the ranges for mem and rem are not known a priori, each bit vector is of a variable size, and grows as needed to accommodate the visited - states. mem and rem are used to calculate a single index in a triangular - array. Since the range of mem is expected in the default case to be about + states. mem and rem are used to calculate a single index in a triangular + array. Since the range of mem is expected in the default case to be about ten times larger than the range of rem, the array is skewed to reduce the - memory usage, with eight times the range for mem than for rem. See the - calculations for offset and bit in beenhere() for the details. + memory usage, with eight times the range for mem than for rem. See the + calculations for offset and bit in been_here() for the details. For the deflate example of 286 symbols limited to 15-bit codes, the bit - vectors grow to total approximately 21 MB, in addition to the 4.3 MB done[] - array itself. + vectors grow to total 5.5 MB, in addition to the 4.3 MB done array itself. */ -/* Globals to avoid propagating constants or constant pointers recursively */ -local int max; /* maximum allowed bit length for the codes */ -local int root; /* size of base code table in bits */ -local int large; /* largest code table so far */ -local size_t size; /* number of elements in num and done */ -local int *code; /* number of symbols assigned to each bit length */ -local big_t *num; /* saved results array for code counting */ -local struct tab *done; /* states already evaluated array */ - -/* Index function for num[] and done[] */ -#define INDEX(i,j,k) (((size_t)((i-1)>>1)*((i-2)>>1)+(j>>1)-1)*(max-1)+k-1) - -/* Free allocated space. Uses globals code, num, and done. */ -local void cleanup(void) -{ - size_t n; - - if (done != NULL) { - for (n = 0; n < size; n++) - if (done[n].len) - free(done[n].vec); - free(done); +// Type for a variable-length, allocated string. +typedef struct { + char *str; // pointer to allocated string + size_t size; // size of allocation + size_t len; // length of string, not including terminating zero +} string_t; + +// Clear a string_t. +local void string_clear(string_t *s) { + s->str[0] = 0; + s->len = 0; +} + +// Initialize a string_t. +local void string_init(string_t *s) { + s->size = 16; + s->str = malloc(s->size); + assert(s->str != NULL && "out of memory"); + string_clear(s); +} + +// Release the allocation of a string_t. +local void string_free(string_t *s) { + free(s->str); + s->str = NULL; + s->size = 0; + s->len = 0; +} + +// Save the results of printf with fmt and the subsequent argument list to s. +// Each call appends to s. The allocated space for s is increased as needed. +local void string_printf(string_t *s, char *fmt, ...) { + va_list ap; + va_start(ap, fmt); + size_t len = s->len; + int ret = vsnprintf(s->str + len, s->size - len, fmt, ap); + assert(ret >= 0 && "out of memory"); + s->len += ret; + if (s->size < s->len + 1) { + do { + s->size <<= 1; + assert(s->size != 0 && "overflow"); + } while (s->size < s->len + 1); + s->str = realloc(s->str, s->size); + assert(s->str != NULL && "out of memory"); + vsnprintf(s->str + len, s->size - len, fmt, ap); } - if (num != NULL) - free(num); - if (code != NULL) - free(code); + va_end(ap); } -/* Return the number of possible Huffman codes using bit patterns of lengths - len through max inclusive, coding syms symbols, with left bit patterns of - length len unused -- return -1 if there is an overflow in the counting. - Keep a record of previous results in num to prevent repeating the same - calculation. Uses the globals max and num. */ -local big_t count(int syms, int len, int left) -{ - big_t sum; /* number of possible codes from this juncture */ - big_t got; /* value returned from count() */ - int least; /* least number of syms to use at this juncture */ - int most; /* most number of syms to use at this juncture */ - int use; /* number of bit patterns to use in next call */ - size_t index; /* index of this case in *num */ - - /* see if only one possible code */ +// Globals to avoid propagating constants or constant pointers recursively. +struct { + int max; // maximum allowed bit length for the codes + int root; // size of base code table in bits + int large; // largest code table so far + size_t size; // number of elements in num and done + big_t tot; // total number of codes with maximum tables size + string_t out; // display of subcodes for maximum tables size + int *code; // number of symbols assigned to each bit length + big_t *num; // saved results array for code counting + struct tab *done; // states already evaluated array +} g; + +// Index function for num[] and done[]. +local inline size_t map(int syms, int left, int len) { + return ((size_t)((syms - 1) >> 1) * ((syms - 2) >> 1) + + (left >> 1) - 1) * (g.max - 1) + + len - 1; +} + +// Free allocated space in globals. +local void cleanup(void) { + if (g.done != NULL) { + for (size_t n = 0; n < g.size; n++) + if (g.done[n].len) + free(g.done[n].vec); + g.size = 0; + free(g.done); g.done = NULL; + } + free(g.num); g.num = NULL; + free(g.code); g.code = NULL; + string_free(&g.out); +} + +// Return the number of possible prefix codes using bit patterns of lengths len +// through max inclusive, coding syms symbols, with left bit patterns of length +// len unused -- return -1 if there is an overflow in the counting. Keep a +// record of previous results in num to prevent repeating the same calculation. +local big_t count(int syms, int left, int len) { + // see if only one possible code if (syms == left) return 1; - /* note and verify the expected state */ - assert(syms > left && left > 0 && len < max); + // note and verify the expected state + assert(syms > left && left > 0 && len < g.max); - /* see if we've done this one already */ - index = INDEX(syms, left, len); - got = num[index]; + // see if we've done this one already + size_t index = map(syms, left, len); + big_t got = g.num[index]; if (got) - return got; /* we have -- return the saved result */ + return got; // we have -- return the saved result - /* we need to use at least this many bit patterns so that the code won't be - incomplete at the next length (more bit patterns than symbols) */ - least = (left << 1) - syms; + // we need to use at least this many bit patterns so that the code won't be + // incomplete at the next length (more bit patterns than symbols) + int least = (left << 1) - syms; if (least < 0) least = 0; - /* we can use at most this many bit patterns, lest there not be enough - available for the remaining symbols at the maximum length (if there were - no limit to the code length, this would become: most = left - 1) */ - most = (((code_t)left << (max - len)) - syms) / - (((code_t)1 << (max - len)) - 1); + // we can use at most this many bit patterns, lest there not be enough + // available for the remaining symbols at the maximum length (if there were + // no limit to the code length, this would become: most = left - 1) + int most = (((code_t)left << (g.max - len)) - syms) / + (((code_t)1 << (g.max - len)) - 1); - /* count all possible codes from this juncture and add them up */ - sum = 0; - for (use = least; use <= most; use++) { - got = count(syms - use, len + 1, (left - use) << 1); + // count all possible codes from this juncture and add them up + big_t sum = 0; + for (int use = least; use <= most; use++) { + got = count(syms - use, (left - use) << 1, len + 1); sum += got; - if (got == (big_t)0 - 1 || sum < got) /* overflow */ - return (big_t)0 - 1; + if (got == (big_t)-1 || sum < got) // overflow + return (big_t)-1; } - /* verify that all recursive calls are productive */ + // verify that all recursive calls are productive assert(sum != 0); - /* save the result and return it */ - num[index] = sum; + // save the result and return it + g.num[index] = sum; return sum; } -/* Return true if we've been here before, set to true if not. Set a bit in a - bit vector to indicate visiting this state. Each (syms,len,left) state - has a variable size bit vector indexed by (mem,rem). The bit vector is - lengthened if needed to allow setting the (mem,rem) bit. */ -local int beenhere(int syms, int len, int left, int mem, int rem) -{ - size_t index; /* index for this state's bit vector */ - size_t offset; /* offset in this state's bit vector */ - int bit; /* mask for this state's bit */ - size_t length; /* length of the bit vector in bytes */ - char *vector; /* new or enlarged bit vector */ - - /* point to vector for (syms,left,len), bit in vector for (mem,rem) */ - index = INDEX(syms, left, len); - mem -= 1 << root; - offset = (mem >> 3) + rem; +// Return true if we've been here before, set to true if not. Set a bit in a +// bit vector to indicate visiting this state. Each (syms,len,left) state has a +// variable size bit vector indexed by (mem,rem). The bit vector is lengthened +// as needed to allow setting the (mem,rem) bit. +local int been_here(int syms, int left, int len, int mem, int rem) { + // point to vector for (syms,left,len), bit in vector for (mem,rem) + size_t index = map(syms, left, len); + mem -= 1 << g.root; // mem always includes the root table + mem >>= 1; // mem and rem are always even + rem >>= 1; + size_t offset = (mem >> 3) + rem; offset = ((offset * (offset + 1)) >> 1) + rem; - bit = 1 << (mem & 7); + int bit = 1 << (mem & 7); - /* see if we've been here */ - length = done[index].len; - if (offset < length && (done[index].vec[offset] & bit) != 0) - return 1; /* done this! */ + // see if we've been here + size_t length = g.done[index].len; + if (offset < length && (g.done[index].vec[offset] & bit) != 0) + return 1; // done this! - /* we haven't been here before -- set the bit to show we have now */ + // we haven't been here before -- set the bit to show we have now - /* see if we need to lengthen the vector in order to set the bit */ + // see if we need to lengthen the vector in order to set the bit if (length <= offset) { - /* if we have one already, enlarge it, zero out the appended space */ + // if we have one already, enlarge it, zero out the appended space + char *vector; if (length) { do { length <<= 1; } while (length <= offset); - vector = realloc(done[index].vec, length); - if (vector != NULL) - memset(vector + done[index].len, 0, length - done[index].len); + vector = realloc(g.done[index].vec, length); + assert(vector != NULL && "out of memory"); + memset(vector + g.done[index].len, 0, length - g.done[index].len); } - /* otherwise we need to make a new vector and zero it out */ + // otherwise we need to make a new vector and zero it out else { - length = 1 << (len - root); + length = 16; while (length <= offset) length <<= 1; - vector = calloc(length, sizeof(char)); - } - - /* in either case, bail if we can't get the memory */ - if (vector == NULL) { - fputs("abort: unable to allocate enough memory\n", stderr); - cleanup(); - exit(1); + vector = calloc(length, 1); + assert(vector != NULL && "out of memory"); } - /* install the new vector */ - done[index].len = length; - done[index].vec = vector; + // install the new vector + g.done[index].len = length; + g.done[index].vec = vector; } - /* set the bit */ - done[index].vec[offset] |= bit; + // set the bit + g.done[index].vec[offset] |= bit; return 0; } -/* Examine all possible codes from the given node (syms, len, left). Compute - the amount of memory required to build inflate's decoding tables, where the - number of code structures used so far is mem, and the number remaining in - the current sub-table is rem. Uses the globals max, code, root, large, and - done. */ -local void examine(int syms, int len, int left, int mem, int rem) -{ - int least; /* least number of syms to use at this juncture */ - int most; /* most number of syms to use at this juncture */ - int use; /* number of bit patterns to use in next call */ - - /* see if we have a complete code */ +// Examine all possible codes from the given node (syms, len, left). Compute +// the amount of memory required to build inflate's decoding tables, where the +// number of code structures used so far is mem, and the number remaining in +// the current sub-table is rem. +local void examine(int syms, int left, int len, int mem, int rem) { + // see if we have a complete code if (syms == left) { - /* set the last code entry */ - code[len] = left; + // set the last code entry + g.code[len] = left; - /* complete computation of memory used by this code */ + // complete computation of memory used by this code while (rem < left) { left -= rem; - rem = 1 << (len - root); + rem = 1 << (len - g.root); mem += rem; } assert(rem == left); - /* if this is a new maximum, show the entries used and the sub-code */ - if (mem > large) { - large = mem; - printf("max %d: ", mem); - for (use = root + 1; use <= max; use++) - if (code[use]) - printf("%d[%d] ", code[use], use); - putchar('\n'); - fflush(stdout); + // if this is at the maximum, show the sub-code + if (mem >= g.large) { + // if this is a new maximum, update the maximum and clear out the + // printed sub-codes from the previous maximum + if (mem > g.large) { + g.large = mem; + string_clear(&g.out); + } + + // compute the starting state for this sub-code + syms = 0; + left = 1 << g.max; + for (int bits = g.max; bits > g.root; bits--) { + syms += g.code[bits]; + left -= g.code[bits]; + assert((left & 1) == 0); + left >>= 1; + } + + // print the starting state and the resulting sub-code to g.out + string_printf(&g.out, "<%u, %u, %u>:", + syms, g.root + 1, ((1 << g.root) - left) << 1); + for (int bits = g.root + 1; bits <= g.max; bits++) + if (g.code[bits]) + string_printf(&g.out, " %d[%d]", g.code[bits], bits); + string_printf(&g.out, "\n"); } - /* remove entries as we drop back down in the recursion */ - code[len] = 0; + // remove entries as we drop back down in the recursion + g.code[len] = 0; return; } - /* prune the tree if we can */ - if (beenhere(syms, len, left, mem, rem)) + // prune the tree if we can + if (been_here(syms, left, len, mem, rem)) return; - /* we need to use at least this many bit patterns so that the code won't be - incomplete at the next length (more bit patterns than symbols) */ - least = (left << 1) - syms; + // we need to use at least this many bit patterns so that the code won't be + // incomplete at the next length (more bit patterns than symbols) + int least = (left << 1) - syms; if (least < 0) least = 0; - /* we can use at most this many bit patterns, lest there not be enough - available for the remaining symbols at the maximum length (if there were - no limit to the code length, this would become: most = left - 1) */ - most = (((code_t)left << (max - len)) - syms) / - (((code_t)1 << (max - len)) - 1); + // we can use at most this many bit patterns, lest there not be enough + // available for the remaining symbols at the maximum length (if there were + // no limit to the code length, this would become: most = left - 1) + int most = (((code_t)left << (g.max - len)) - syms) / + (((code_t)1 << (g.max - len)) - 1); - /* occupy least table spaces, creating new sub-tables as needed */ - use = least; + // occupy least table spaces, creating new sub-tables as needed + int use = least; while (rem < use) { use -= rem; - rem = 1 << (len - root); + rem = 1 << (len - g.root); mem += rem; } rem -= use; - /* examine codes from here, updating table space as we go */ + // examine codes from here, updating table space as we go for (use = least; use <= most; use++) { - code[len] = use; - examine(syms - use, len + 1, (left - use) << 1, - mem + (rem ? 1 << (len - root) : 0), rem << 1); + g.code[len] = use; + examine(syms - use, (left - use) << 1, len + 1, + mem + (rem ? 1 << (len - g.root) : 0), rem << 1); if (rem == 0) { - rem = 1 << (len - root); + rem = 1 << (len - g.root); mem += rem; } rem--; } - /* remove entries as we drop back down in the recursion */ - code[len] = 0; + // remove entries as we drop back down in the recursion + g.code[len] = 0; } -/* Look at all sub-codes starting with root + 1 bits. Look at only the valid - intermediate code states (syms, left, len). For each completed code, - calculate the amount of memory required by inflate to build the decoding - tables. Find the maximum amount of memory required and show the code that - requires that maximum. Uses the globals max, root, and num. */ -local void enough(int syms) -{ - int n; /* number of remaing symbols for this node */ - int left; /* number of unused bit patterns at this length */ - size_t index; /* index of this case in *num */ - - /* clear code */ - for (n = 0; n <= max; n++) - code[n] = 0; - - /* look at all (root + 1) bit and longer codes */ - large = 1 << root; /* base table */ - if (root < max) /* otherwise, there's only a base table */ - for (n = 3; n <= syms; n++) - for (left = 2; left < n; left += 2) - { - /* look at all reachable (root + 1) bit nodes, and the - resulting codes (complete at root + 2 or more) */ - index = INDEX(n, left, root + 1); - if (root + 1 < max && num[index]) /* reachable node */ - examine(n, root + 1, left, 1 << root, 0); - - /* also look at root bit codes with completions at root + 1 - bits (not saved in num, since complete), just in case */ - if (num[index - 1] && n <= left << 1) - examine((n - left) << 1, root + 1, (n - left) << 1, - 1 << root, 0); +// Look at all sub-codes starting with root + 1 bits. Look at only the valid +// intermediate code states (syms, left, len). For each completed code, +// calculate the amount of memory required by inflate to build the decoding +// tables. Find the maximum amount of memory required and show the codes that +// require that maximum. +local void enough(int syms) { + // clear code + for (int n = 0; n <= g.max; n++) + g.code[n] = 0; + + // look at all (root + 1) bit and longer codes + string_clear(&g.out); // empty saved results + g.large = 1 << g.root; // base table + if (g.root < g.max) // otherwise, there's only a base table + for (int n = 3; n <= syms; n++) + for (int left = 2; left < n; left += 2) { + // look at all reachable (root + 1) bit nodes, and the + // resulting codes (complete at root + 2 or more) + size_t index = map(n, left, g.root + 1); + if (g.root + 1 < g.max && g.num[index]) // reachable node + examine(n, left, g.root + 1, 1 << g.root, 0); + + // also look at root bit codes with completions at root + 1 + // bits (not saved in num, since complete), just in case + if (g.num[index - 1] && n <= left << 1) + examine((n - left) << 1, (n - left) << 1, g.root + 1, + 1 << g.root, 0); } - /* done */ - printf("done: maximum of %d table entries\n", large); + // done + printf("maximum of %d table entries for root = %d\n", g.large, g.root); + fputs(g.out.str, stdout); } -/* - Examine and show the total number of possible Huffman codes for a given - maximum number of symbols, initial root table size, and maximum code length - in bits -- those are the command arguments in that order. The default - values are 286, 9, and 15 respectively, for the deflate literal/length code. - The possible codes are counted for each number of coded symbols from two to - the maximum. The counts for each of those and the total number of codes are - shown. The maximum number of inflate table entires is then calculated - across all possible codes. Each new maximum number of table entries and the - associated sub-code (starting at root + 1 == 10 bits) is shown. - - To count and examine Huffman codes that are not length-limited, provide a - maximum length equal to the number of symbols minus one. - - For the deflate literal/length code, use "enough". For the deflate distance - code, use "enough 30 6". - - This uses the %llu printf format to print big_t numbers, which assumes that - big_t is an unsigned long long. If the big_t type is changed (for example - to a multiple precision type), the method of printing will also need to be - updated. - */ -int main(int argc, char **argv) -{ - int syms; /* total number of symbols to code */ - int n; /* number of symbols to code for this run */ - big_t got; /* return value of count() */ - big_t sum; /* accumulated number of codes over n */ - code_t word; /* for counting bits in code_t */ - - /* set up globals for cleanup() */ - code = NULL; - num = NULL; - done = NULL; - - /* get arguments -- default to the deflate literal/length code */ - syms = 286; - root = 9; - max = 15; +// Examine and show the total number of possible prefix codes for a given +// maximum number of symbols, initial root table size, and maximum code length +// in bits -- those are the command arguments in that order. The default values +// are 286, 9, and 15 respectively, for the deflate literal/length code. The +// possible codes are counted for each number of coded symbols from two to the +// maximum. The counts for each of those and the total number of codes are +// shown. The maximum number of inflate table entries is then calculated across +// all possible codes. Each new maximum number of table entries and the +// associated sub-code (starting at root + 1 == 10 bits) is shown. +// +// To count and examine prefix codes that are not length-limited, provide a +// maximum length equal to the number of symbols minus one. +// +// For the deflate literal/length code, use "enough". For the deflate distance +// code, use "enough 30 6". +int main(int argc, char **argv) { + // set up globals for cleanup() + g.code = NULL; + g.num = NULL; + g.done = NULL; + string_init(&g.out); + + // get arguments -- default to the deflate literal/length code + int syms = 286; + g.root = 9; + g.max = 15; if (argc > 1) { syms = atoi(argv[1]); if (argc > 2) { - root = atoi(argv[2]); + g.root = atoi(argv[2]); if (argc > 3) - max = atoi(argv[3]); + g.max = atoi(argv[3]); } } - if (argc > 4 || syms < 2 || root < 1 || max < 1) { + if (argc > 4 || syms < 2 || g.root < 1 || g.max < 1) { fputs("invalid arguments, need: [sym >= 2 [root >= 1 [max >= 1]]]\n", stderr); return 1; } - /* if not restricting the code length, the longest is syms - 1 */ - if (max > syms - 1) - max = syms - 1; + // if not restricting the code length, the longest is syms - 1 + if (g.max > syms - 1) + g.max = syms - 1; - /* determine the number of bits in a code_t */ - for (n = 0, word = 1; word; n++, word <<= 1) - ; + // determine the number of bits in a code_t + int bits = 0; + for (code_t word = 1; word; word <<= 1) + bits++; - /* make sure that the calculation of most will not overflow */ - if (max > n || (code_t)(syms - 2) >= (((code_t)0 - 1) >> (max - 1))) { + // make sure that the calculation of most will not overflow + if (g.max > bits || (code_t)(syms - 2) >= ((code_t)-1 >> (g.max - 1))) { fputs("abort: code length too long for internal types\n", stderr); return 1; } - /* reject impossible code requests */ - if ((code_t)(syms - 1) > ((code_t)1 << max) - 1) { + // reject impossible code requests + if ((code_t)(syms - 1) > ((code_t)1 << g.max) - 1) { fprintf(stderr, "%d symbols cannot be coded in %d bits\n", - syms, max); + syms, g.max); return 1; } - /* allocate code vector */ - code = calloc(max + 1, sizeof(int)); - if (code == NULL) { - fputs("abort: unable to allocate enough memory\n", stderr); - return 1; - } + // allocate code vector + g.code = calloc(g.max + 1, sizeof(int)); + assert(g.code != NULL && "out of memory"); - /* determine size of saved results array, checking for overflows, - allocate and clear the array (set all to zero with calloc()) */ - if (syms == 2) /* iff max == 1 */ - num = NULL; /* won't be saving any results */ + // determine size of saved results array, checking for overflows, + // allocate and clear the array (set all to zero with calloc()) + if (syms == 2) // iff max == 1 + g.num = NULL; // won't be saving any results else { - size = syms >> 1; - if (size > ((size_t)0 - 1) / (n = (syms - 1) >> 1) || - (size *= n, size > ((size_t)0 - 1) / (n = max - 1)) || - (size *= n, size > ((size_t)0 - 1) / sizeof(big_t)) || - (num = calloc(size, sizeof(big_t))) == NULL) { - fputs("abort: unable to allocate enough memory\n", stderr); - cleanup(); - return 1; - } + g.size = syms >> 1; + int n = (syms - 1) >> 1; + assert(g.size <= (size_t)-1 / n && "overflow"); + g.size *= n; + n = g.max - 1; + assert(g.size <= (size_t)-1 / n && "overflow"); + g.size *= n; + g.num = calloc(g.size, sizeof(big_t)); + assert(g.num != NULL && "out of memory"); } - /* count possible codes for all numbers of symbols, add up counts */ - sum = 0; - for (n = 2; n <= syms; n++) { - got = count(n, 1, 2); + // count possible codes for all numbers of symbols, add up counts + big_t sum = 0; + for (int n = 2; n <= syms; n++) { + big_t got = count(n, 2, 1); sum += got; - if (got == (big_t)0 - 1 || sum < got) { /* overflow */ - fputs("abort: can't count that high!\n", stderr); - cleanup(); - return 1; - } - printf("%llu %d-codes\n", got, n); + assert(got != (big_t)-1 && sum >= got && "overflow"); } - printf("%llu total codes for 2 to %d symbols", sum, syms); - if (max < syms - 1) - printf(" (%d-bit length limit)\n", max); + printf("%"PRIbig" total codes for 2 to %d symbols", sum, syms); + if (g.max < syms - 1) + printf(" (%d-bit length limit)\n", g.max); else puts(" (no length limit)"); - /* allocate and clear done array for beenhere() */ + // allocate and clear done array for been_here() if (syms == 2) - done = NULL; - else if (size > ((size_t)0 - 1) / sizeof(struct tab) || - (done = calloc(size, sizeof(struct tab))) == NULL) { - fputs("abort: unable to allocate enough memory\n", stderr); - cleanup(); - return 1; + g.done = NULL; + else { + g.done = calloc(g.size, sizeof(struct tab)); + assert(g.done != NULL && "out of memory"); } - /* find and show maximum inflate table usage */ - if (root > max) /* reduce root to max length */ - root = max; - if ((code_t)syms < ((code_t)1 << (root + 1))) + // find and show maximum inflate table usage + if (g.root > g.max) // reduce root to max length + g.root = g.max; + if ((code_t)syms < ((code_t)1 << (g.root + 1))) enough(syms); else - puts("cannot handle minimum code lengths > root"); + fputs("cannot handle minimum code lengths > root", stderr); - /* done */ + // done cleanup(); return 0; } diff --git a/zlib/examples/fitblk.c b/zlib/examples/fitblk.c index c61de5c99672..723dc0028127 100644 --- a/zlib/examples/fitblk.c +++ b/zlib/examples/fitblk.c @@ -17,7 +17,7 @@ data in order to determine how much of that input will compress to nearly the requested output block size. The first pass generates enough deflate blocks to produce output to fill the requested - output size plus a specfied excess amount (see the EXCESS define + output size plus a specified excess amount (see the EXCESS define below). The last deflate block may go quite a bit past that, but is discarded. The second pass decompresses and recompresses just the compressed data that fit in the requested plus excess sized @@ -109,7 +109,7 @@ local int recompress(z_streamp inf, z_streamp def) if (ret == Z_MEM_ERROR) return ret; - /* compress what was decompresed until done or no room */ + /* compress what was decompressed until done or no room */ def->avail_in = RAWLEN - inf->avail_out; def->next_in = raw; if (inf->avail_out != 0) @@ -198,7 +198,7 @@ int main(int argc, char **argv) if (ret == Z_MEM_ERROR) quit("out of memory"); - /* set up for next reocmpression */ + /* set up for next recompression */ ret = inflateReset(&inf); assert(ret != Z_STREAM_ERROR); ret = deflateReset(&def); diff --git a/zlib/examples/gun.c b/zlib/examples/gun.c index be44fa51ff52..bea5497e5c2b 100644 --- a/zlib/examples/gun.c +++ b/zlib/examples/gun.c @@ -43,7 +43,7 @@ gun will also decompress files made by Unix compress, which uses LZW compression. These files are automatically detected by virtue of their magic header bytes. Since the end of Unix compress stream is marked by the - end-of-file, they cannot be concantenated. If a Unix compress stream is + end-of-file, they cannot be concatenated. If a Unix compress stream is encountered in an input file, it is the last stream in that file. Like gunzip and uncompress, the file attributes of the original compressed diff --git a/zlib/examples/gzappend.c b/zlib/examples/gzappend.c index 662dec3794b7..23e93cf68995 100644 --- a/zlib/examples/gzappend.c +++ b/zlib/examples/gzappend.c @@ -33,7 +33,7 @@ * - Add L to constants in lseek() calls * - Remove some debugging information in error messages * - Use new data_type definition for zlib 1.2.1 - * - Simplfy and unify file operations + * - Simplify and unify file operations * - Finish off gzip file in gztack() * - Use deflatePrime() instead of adding empty blocks * - Keep gzip file clean on appended file read errors @@ -54,7 +54,7 @@ block boundary to facilitate locating and modifying the last block bit at the start of the final deflate block. Also whether using Z_BLOCK or not, another required feature of zlib 1.2.x is that inflate() now provides the - number of unusued bits in the last input byte used. gzappend will not work + number of unused bits in the last input byte used. gzappend will not work with versions of zlib earlier than 1.2.1. gzappend first decompresses the gzip file internally, discarding all but @@ -137,7 +137,7 @@ local void rotate(unsigned char *list, unsigned len, unsigned rot) /* do simple left shift by one */ if (rot == 1) { tmp = *list; - memcpy(list, list + 1, len - 1); + memmove(list, list + 1, len - 1); *last = tmp; return; } diff --git a/zlib/examples/gzlog.c b/zlib/examples/gzlog.c index b8c29274e8b9..da1b02e7337d 100644 --- a/zlib/examples/gzlog.c +++ b/zlib/examples/gzlog.c @@ -1,8 +1,8 @@ /* * gzlog.c - * Copyright (C) 2004, 2008, 2012, 2016 Mark Adler, all rights reserved + * Copyright (C) 2004, 2008, 2012, 2016, 2019 Mark Adler, all rights reserved * For conditions of distribution and use, see copyright notice in gzlog.h - * version 2.2, 14 Aug 2012 + * version 2.3, 25 May 2019 */ /* @@ -212,8 +212,8 @@ to the appropriate recovery below. If there is no foo.add file, provide a zero data length to the recovery. In that case, the append recovery restores the foo.gz to the previous compressed + uncompressed data state. - For the the compress recovery, a missing foo.add file results in foo.gz - being restored to the previous compressed-only data state. + For the compress recovery, a missing foo.add file results in foo.gz being + restored to the previous compressed-only data state. - Append recovery: - Pick up append at + step above - Compress recovery: @@ -756,12 +756,14 @@ local int log_recover(struct log *log, int op) return -2; } if ((fd = open(log->path, O_RDONLY, 0)) < 0) { + free(data); log_log(log, op, ".add file read failure"); return -1; } ret = (size_t)read(fd, data, len) != len; close(fd); if (ret) { + free(data); log_log(log, op, ".add file read failure"); return -1; } diff --git a/zlib/examples/gzlog.h b/zlib/examples/gzlog.h index 86f0cecba5b4..4f0510955611 100644 --- a/zlib/examples/gzlog.h +++ b/zlib/examples/gzlog.h @@ -40,7 +40,7 @@ its new size at that time. After each write operation, the log file is a valid gzip file that can decompressed to recover what was written. - The gzlog operations can be interupted at any point due to an application or + The gzlog operations can be interrupted at any point due to an application or system crash, and the log file will be recovered the next time the log is opened with gzlog_open(). */ diff --git a/zlib/examples/gznorm.c b/zlib/examples/gznorm.c new file mode 100644 index 000000000000..68e0a0f29be4 --- /dev/null +++ b/zlib/examples/gznorm.c @@ -0,0 +1,470 @@ +/* gznorm.c -- normalize a gzip stream + * Copyright (C) 2018 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + * Version 1.0 7 Oct 2018 Mark Adler */ + +// gznorm takes a gzip stream, potentially containing multiple members, and +// converts it to a gzip stream with a single member. In addition the gzip +// header is normalized, removing the file name and time stamp, and setting the +// other header contents (XFL, OS) to fixed values. gznorm does not recompress +// the data, so it is fast, but no advantage is gained from the history that +// could be available across member boundaries. + +#include // fread, fwrite, putc, fflush, ferror, fprintf, + // vsnprintf, stdout, stderr, NULL, FILE +#include // malloc, free +#include // strerror +#include // errno +#include // va_list, va_start, va_end +#include "zlib.h" // inflateInit2, inflate, inflateReset, inflateEnd, + // z_stream, z_off_t, crc32_combine, Z_NULL, Z_BLOCK, + // Z_OK, Z_STREAM_END, Z_BUF_ERROR, Z_DATA_ERROR, + // Z_MEM_ERROR + +#if defined(MSDOS) || defined(OS2) || defined(WIN32) || defined(__CYGWIN__) +# include +# include +# define SET_BINARY_MODE(file) setmode(fileno(file), O_BINARY) +#else +# define SET_BINARY_MODE(file) +#endif + +#define local static + +// printf to an allocated string. Return the string, or NULL if the printf or +// allocation fails. +local char *aprintf(char *fmt, ...) { + // Get the length of the result of the printf. + va_list args; + va_start(args, fmt); + int len = vsnprintf(NULL, 0, fmt, args); + va_end(args); + if (len < 0) + return NULL; + + // Allocate the required space and printf to it. + char *str = malloc(len + 1); + if (str == NULL) + return NULL; + va_start(args, fmt); + vsnprintf(str, len + 1, fmt, args); + va_end(args); + return str; +} + +// Return with an error, putting an allocated error message in *err. Doing an +// inflateEnd() on an already ended state, or one with state set to Z_NULL, is +// permitted. +#define BYE(...) \ + do { \ + inflateEnd(&strm); \ + *err = aprintf(__VA_ARGS__); \ + return 1; \ + } while (0) + +// Chunk size for buffered reads and for decompression. Twice this many bytes +// will be allocated on the stack by gzip_normalize(). Must fit in an unsigned. +#define CHUNK 16384 + +// Read a gzip stream from in and write an equivalent normalized gzip stream to +// out. If given no input, an empty gzip stream will be written. If successful, +// 0 is returned, and *err is set to NULL. On error, 1 is returned, where the +// details of the error are returned in *err, a pointer to an allocated string. +// +// The input may be a stream with multiple gzip members, which is converted to +// a single gzip member on the output. Each gzip member is decompressed at the +// level of deflate blocks. This enables clearing the last-block bit, shifting +// the compressed data to concatenate to the previous member's compressed data, +// which can end at an arbitrary bit boundary, and identifying stored blocks in +// order to resynchronize those to byte boundaries. The deflate compressed data +// is terminated with a 10-bit empty fixed block. If any members on the input +// end with a 10-bit empty fixed block, then that block is excised from the +// stream. This avoids appending empty fixed blocks for every normalization, +// and assures that gzip_normalize applied a second time will not change the +// input. The pad bits after stored block headers and after the final deflate +// block are all forced to zeros. +local int gzip_normalize(FILE *in, FILE *out, char **err) { + // initialize the inflate engine to process a gzip member + z_stream strm; + strm.zalloc = Z_NULL; + strm.zfree = Z_NULL; + strm.opaque = Z_NULL; + strm.avail_in = 0; + strm.next_in = Z_NULL; + if (inflateInit2(&strm, 15 + 16) != Z_OK) + BYE("out of memory"); + + // State while processing the input gzip stream. + enum { // BETWEEN -> HEAD -> BLOCK -> TAIL -> BETWEEN -> ... + BETWEEN, // between gzip members (must end in this state) + HEAD, // reading a gzip header + BLOCK, // reading deflate blocks + TAIL // reading a gzip trailer + } state = BETWEEN; // current component being processed + unsigned long crc = 0; // accumulated CRC of uncompressed data + unsigned long len = 0; // accumulated length of uncompressed data + unsigned long buf = 0; // deflate stream bit buffer of num bits + int num = 0; // number of bits in buf (at bottom) + + // Write a canonical gzip header (no mod time, file name, comment, extra + // block, or extra flags, and OS is marked as unknown). + fwrite("\x1f\x8b\x08\0\0\0\0\0\0\xff", 1, 10, out); + + // Process the gzip stream from in until reaching the end of the input, + // encountering invalid input, or experiencing an i/o error. + int more; // true if not at the end of the input + do { + // State inside this loop. + unsigned char *put; // next input buffer location to process + int prev; // number of bits from previous block in + // the bit buffer, or -1 if not at the + // start of a block + unsigned long long memb; // uncompressed length of member + size_t tail; // number of trailer bytes read (0..8) + unsigned long part; // accumulated trailer component + + // Get the next chunk of input from in. + unsigned char dat[CHUNK]; + strm.avail_in = fread(dat, 1, CHUNK, in); + if (strm.avail_in == 0) + break; + more = strm.avail_in == CHUNK; + strm.next_in = put = dat; + + // Run that chunk of input through the inflate engine to exhaustion. + do { + // At this point it is assured that strm.avail_in > 0. + + // Inflate until the end of a gzip component (header, deflate + // block, trailer) is reached, or until all of the chunk is + // consumed. The resulting decompressed data is discarded, though + // the total size of the decompressed data in each member is + // tracked, for the calculation of the total CRC. + do { + // inflate and handle any errors + unsigned char scrap[CHUNK]; + strm.avail_out = CHUNK; + strm.next_out = scrap; + int ret = inflate(&strm, Z_BLOCK); + if (ret == Z_MEM_ERROR) + BYE("out of memory"); + if (ret == Z_DATA_ERROR) + BYE("input invalid: %s", strm.msg); + if (ret != Z_OK && ret != Z_BUF_ERROR && ret != Z_STREAM_END) + BYE("internal error"); + + // Update the number of uncompressed bytes generated in this + // member. The actual count (not modulo 2^32) is required to + // correctly compute the total CRC. + unsigned got = CHUNK - strm.avail_out; + memb += got; + if (memb < got) + BYE("overflow error"); + + // Continue to process this chunk until it is consumed, or + // until the end of a component (header, deflate block, or + // trailer) is reached. + } while (strm.avail_out == 0 && (strm.data_type & 0x80) == 0); + + // Since strm.avail_in was > 0 for the inflate call, some input was + // just consumed. It is therefore assured that put < strm.next_in. + + // Disposition the consumed component or part of a component. + switch (state) { + case BETWEEN: + state = HEAD; + // Fall through to HEAD when some or all of the header is + // processed. + + case HEAD: + // Discard the header. + if (strm.data_type & 0x80) { + // End of header reached -- deflate blocks follow. + put = strm.next_in; + prev = num; + memb = 0; + state = BLOCK; + } + break; + + case BLOCK: + // Copy the deflate stream to the output, but with the + // last-block-bit cleared. Re-synchronize stored block + // headers to the output byte boundaries. The bytes at + // put..strm.next_in-1 is the compressed data that has been + // processed and is ready to be copied to the output. + + // At this point, it is assured that new compressed data is + // available, i.e., put < strm.next_in. If prev is -1, then + // that compressed data starts in the middle of a deflate + // block. If prev is not -1, then the bits in the bit + // buffer, possibly combined with the bits in *put, contain + // the three-bit header of the new deflate block. In that + // case, prev is the number of bits from the previous block + // that remain in the bit buffer. Since num is the number + // of bits in the bit buffer, we have that num - prev is + // the number of bits from the new block currently in the + // bit buffer. + + // If strm.data_type & 0xc0 is 0x80, then the last byte of + // the available compressed data includes the last bits of + // the end of a deflate block. In that case, that last byte + // also has strm.data_type & 0x1f bits of the next deflate + // block, in the range 0..7. If strm.data_type & 0xc0 is + // 0xc0, then the last byte of the compressed data is the + // end of the deflate stream, followed by strm.data_type & + // 0x1f pad bits, also in the range 0..7. + + // Set bits to the number of bits not yet consumed from the + // last byte. If we are at the end of the block, bits is + // either the number of bits in the last byte belonging to + // the next block, or the number of pad bits after the + // final block. In either of those cases, bits is in the + // range 0..7. + ; // (required due to C syntax oddity) + int bits = strm.data_type & 0x1f; + + if (prev != -1) { + // We are at the start of a new block. Clear the last + // block bit, and check for special cases. If it is a + // stored block, then emit the header and pad to the + // next byte boundary. If it is a final, empty fixed + // block, then excise it. + + // Some or all of the three header bits for this block + // may already be in the bit buffer. Load any remaining + // header bits into the bit buffer. + if (num - prev < 3) { + buf += (unsigned long)*put++ << num; + num += 8; + } + + // Set last to have a 1 in the position of the last + // block bit in the bit buffer. + unsigned long last = (unsigned long)1 << prev; + + if (((buf >> prev) & 7) == 3) { + // This is a final fixed block. Load at least ten + // bits from this block, including the header, into + // the bit buffer. We already have at least three, + // so at most one more byte needs to be loaded. + if (num - prev < 10) { + if (put == strm.next_in) + // Need to go get and process more input. + // We'll end up back here to finish this. + break; + buf += (unsigned long)*put++ << num; + num += 8; + } + if (((buf >> prev) & 0x3ff) == 3) { + // That final fixed block is empty. Delete it + // to avoid adding an empty block every time a + // gzip stream is normalized. + num = prev; + buf &= last - 1; // zero the pad bits + } + } + else if (((buf >> prev) & 6) == 0) { + // This is a stored block. Flush to the next + // byte boundary after the three-bit header. + num = (prev + 10) & ~7; + buf &= last - 1; // zero the pad bits + } + + // Clear the last block bit. + buf &= ~last; + + // Write out complete bytes in the bit buffer. + while (num >= 8) { + putc(buf, out); + buf >>= 8; + num -= 8; + } + + // If no more bytes left to process, then we have + // consumed the byte that had bits from the next block. + if (put == strm.next_in) + bits = 0; + } + + // We are done handling the deflate block header. Now copy + // all or almost all of the remaining compressed data that + // has been processed so far. Don't copy one byte at the + // end if it contains bits from the next deflate block or + // pad bits at the end of a deflate block. + + // mix is 1 if we are at the end of a deflate block, and if + // some of the bits in the last byte follow this block. mix + // is 0 if we are in the middle of a deflate block, if the + // deflate block ended on a byte boundary, or if all of the + // compressed data processed so far has been consumed. + int mix = (strm.data_type & 0x80) && bits; + + // Copy all of the processed compressed data to the output, + // except for the last byte if it contains bits from the + // next deflate block or pad bits at the end of the deflate + // stream. Copy the data after shifting in num bits from + // buf in front of it, leaving num bits from the end of the + // compressed data in buf when done. + unsigned char *end = strm.next_in - mix; + if (put < end) { + if (num) + // Insert num bits from buf before the data being + // copied. + do { + buf += (unsigned)(*put++) << num; + putc(buf, out); + buf >>= 8; + } while (put < end); + else { + // No shifting needed -- write directly. + fwrite(put, 1, end - put, out); + put = end; + } + } + + // Process the last processed byte if it wasn't written. + if (mix) { + // Load the last byte into the bit buffer. + buf += (unsigned)(*put++) << num; + num += 8; + + if (strm.data_type & 0x40) { + // We are at the end of the deflate stream and + // there are bits pad bits. Discard the pad bits + // and write a byte to the output, if available. + // Leave the num bits left over in buf to prepend + // to the next deflate stream. + num -= bits; + if (num >= 8) { + putc(buf, out); + num -= 8; + buf >>= 8; + } + + // Force the pad bits in the bit buffer to zeros. + buf &= ((unsigned long)1 << num) - 1; + + // Don't need to set prev here since going to TAIL. + } + else + // At the end of an internal deflate block. Leave + // the last byte in the bit buffer to examine on + // the next entry to BLOCK, when more bits from the + // next block will be available. + prev = num - bits; // number of bits in buffer + // from current block + } + + // Don't have a byte left over, so we are in the middle of + // a deflate block, or the deflate block ended on a byte + // boundary. Set prev appropriately for the next entry into + // BLOCK. + else if (strm.data_type & 0x80) + // The block ended on a byte boundary, so no header + // bits are in the bit buffer. + prev = num; + else + // In the middle of a deflate block, so no header here. + prev = -1; + + // Check for the end of the deflate stream. + if ((strm.data_type & 0xc0) == 0xc0) { + // That ends the deflate stream on the input side, the + // pad bits were discarded, and any remaining bits from + // the last block in the stream are saved in the bit + // buffer to prepend to the next stream. Process the + // gzip trailer next. + tail = 0; + part = 0; + state = TAIL; + } + break; + + case TAIL: + // Accumulate available trailer bytes to update the total + // CRC and the total uncompressed length. + do { + part = (part >> 8) + ((unsigned long)(*put++) << 24); + tail++; + if (tail == 4) { + // Update the total CRC. + z_off_t len2 = memb; + if (len2 < 0 || (unsigned long long)len2 != memb) + BYE("overflow error"); + crc = crc ? crc32_combine(crc, part, len2) : part; + part = 0; + } + else if (tail == 8) { + // Update the total uncompressed length. (It's ok + // if this sum is done modulo 2^32.) + len += part; + + // At the end of a member. Set up to inflate an + // immediately following gzip member. (If we made + // it this far, then the trailer was valid.) + if (inflateReset(&strm) != Z_OK) + BYE("internal error"); + state = BETWEEN; + break; + } + } while (put < strm.next_in); + break; + } + + // Process the input buffer until completely consumed. + } while (strm.avail_in > 0); + + // Process input until end of file, invalid input, or i/o error. + } while (more); + + // Done with the inflate engine. + inflateEnd(&strm); + + // Verify the validity of the input. + if (state != BETWEEN) + BYE("input invalid: incomplete gzip stream"); + + // Write the remaining deflate stream bits, followed by a terminating + // deflate fixed block. + buf += (unsigned long)3 << num; + putc(buf, out); + putc(buf >> 8, out); + if (num > 6) + putc(0, out); + + // Write the gzip trailer, which is the CRC and the uncompressed length + // modulo 2^32, both in little-endian order. + putc(crc, out); + putc(crc >> 8, out); + putc(crc >> 16, out); + putc(crc >> 24, out); + putc(len, out); + putc(len >> 8, out); + putc(len >> 16, out); + putc(len >> 24, out); + fflush(out); + + // Check for any i/o errors. + if (ferror(in) || ferror(out)) + BYE("i/o error: %s", strerror(errno)); + + // All good! + *err = NULL; + return 0; +} + +// Normalize the gzip stream on stdin, writing the result to stdout. +int main(void) { + // Avoid end-of-line conversions on evil operating systems. + SET_BINARY_MODE(stdin); + SET_BINARY_MODE(stdout); + + // Normalize from stdin to stdout, returning 1 on error, 0 if ok. + char *err; + int ret = gzip_normalize(stdin, stdout, &err); + if (ret) + fprintf(stderr, "gznorm error: %s\n", err); + free(err); + return ret; +} diff --git a/zlib/examples/zlib_how.html b/zlib/examples/zlib_how.html index 444ff1c9a32e..43271b988a72 100644 --- a/zlib/examples/zlib_how.html +++ b/zlib/examples/zlib_how.html @@ -1,10 +1,10 @@ - + zlib Usage Example - +

zlib Usage Example

@@ -17,7 +17,7 @@ from an input file to an output file using deflate() and inflate()< annotations are interspersed between lines of the code. So please read between the lines. We hope this helps explain some of the intricacies of zlib.

-Without further adieu, here is the program zpipe.c: +Without further ado, here is the program zpipe.c:


 /* zpipe.c: example of proper use of zlib's inflate() and deflate()
    Not copyrighted -- provided to the public domain
@@ -155,13 +155,11 @@ before we fall out of the loop at the bottom.
 
We start off by reading data from the input file. The number of bytes read is put directly into avail_in, and a pointer to those bytes is put into next_in. We also -check to see if end-of-file on the input has been reached. If we are at the end of file, then flush is set to the +check to see if end-of-file on the input has been reached using feof(). +If we are at the end of file, then flush is set to the zlib constant Z_FINISH, which is later passed to deflate() to -indicate that this is the last chunk of input data to compress. We need to use feof() -to check for end-of-file as opposed to seeing if fewer than CHUNK bytes have been read. The -reason is that if the input file length is an exact multiple of CHUNK, we will miss -the fact that we got to the end-of-file, and not know to tell deflate() to finish -up the compressed stream. If we are not yet at the end of the input, then the zlib +indicate that this is the last chunk of input data to compress. +If we are not yet at the end of the input, then the zlib constant Z_NO_FLUSH will be passed to deflate to indicate that we are still in the middle of the uncompressed data.

@@ -540,6 +538,12 @@ int main(int argc, char **argv) }


-Copyright (c) 2004, 2005 by Mark Adler
Last modified 11 December 2005
+Last modified 24 January 2023
+Copyright © 2004-2023 Mark Adler

+ +Creative Commons License + +Creative Commons Attribution-NoDerivatives 4.0 International License. diff --git a/zlib/examples/zran.c b/zlib/examples/zran.c index 4fec6594a664..d3135955b02b 100644 --- a/zlib/examples/zran.c +++ b/zlib/examples/zran.c @@ -1,383 +1,503 @@ -/* zran.c -- example of zlib/gzip stream indexing and random access - * Copyright (C) 2005, 2012 Mark Adler +/* zran.c -- example of deflate stream indexing and random access + * Copyright (C) 2005, 2012, 2018, 2023 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h - Version 1.1 29 Sep 2012 Mark Adler */ + * Version 1.4 13 Apr 2023 Mark Adler */ /* Version History: 1.0 29 May 2005 First version 1.1 29 Sep 2012 Fix memory reallocation error + 1.2 14 Oct 2018 Handle gzip streams with multiple members + Add a header file to facilitate usage in applications + 1.3 18 Feb 2023 Permit raw deflate streams as well as zlib and gzip + Permit crossing gzip member boundaries when extracting + Support a size_t size when extracting (was an int) + Do a binary search over the index for an access point + Expose the access point type to enable save and load + 1.4 13 Apr 2023 Add a NOPRIME define to not use inflatePrime() */ -/* Illustrate the use of Z_BLOCK, inflatePrime(), and inflateSetDictionary() - for random access of a compressed file. A file containing a zlib or gzip - stream is provided on the command line. The compressed stream is decoded in - its entirety, and an index built with access points about every SPAN bytes - in the uncompressed output. The compressed file is left open, and can then - be read randomly, having to decompress on the average SPAN/2 uncompressed - bytes before getting to the desired block of data. - - An access point can be created at the start of any deflate block, by saving - the starting file offset and bit of that block, and the 32K bytes of - uncompressed data that precede that block. Also the uncompressed offset of - that block is saved to provide a referece for locating a desired starting - point in the uncompressed stream. build_index() works by decompressing the - input zlib or gzip stream a block at a time, and at the end of each block - deciding if enough uncompressed data has gone by to justify the creation of - a new access point. If so, that point is saved in a data structure that - grows as needed to accommodate the points. - - To use the index, an offset in the uncompressed data is provided, for which - the latest access point at or preceding that offset is located in the index. - The input file is positioned to the specified location in the index, and if - necessary the first few bits of the compressed data is read from the file. - inflate is initialized with those bits and the 32K of uncompressed data, and - the decompression then proceeds until the desired offset in the file is - reached. Then the decompression continues to read the desired uncompressed - data from the file. - - Another approach would be to generate the index on demand. In that case, - requests for random access reads from the compressed data would try to use - the index, but if a read far enough past the end of the index is required, - then further index entries would be generated and added. - - There is some fair bit of overhead to starting inflation for the random - access, mainly copying the 32K byte dictionary. So if small pieces of the - file are being accessed, it would make sense to implement a cache to hold - some lookahead and avoid many calls to extract() for small lengths. - - Another way to build an index would be to use inflateCopy(). That would - not be constrained to have access points at block boundaries, but requires - more memory per access point, and also cannot be saved to file due to the - use of pointers in the state. The approach here allows for storage of the - index in a file. - */ +// Illustrate the use of Z_BLOCK, inflatePrime(), and inflateSetDictionary() +// for random access of a compressed file. A file containing a raw deflate +// stream is provided on the command line. The compressed stream is decoded in +// its entirety, and an index built with access points about every SPAN bytes +// in the uncompressed output. The compressed file is left open, and can then +// be read randomly, having to decompress on the average SPAN/2 uncompressed +// bytes before getting to the desired block of data. +// +// An access point can be created at the start of any deflate block, by saving +// the starting file offset and bit of that block, and the 32K bytes of +// uncompressed data that precede that block. Also the uncompressed offset of +// that block is saved to provide a reference for locating a desired starting +// point in the uncompressed stream. deflate_index_build() decompresses the +// input raw deflate stream a block at a time, and at the end of each block +// decides if enough uncompressed data has gone by to justify the creation of a +// new access point. If so, that point is saved in a data structure that grows +// as needed to accommodate the points. +// +// To use the index, an offset in the uncompressed data is provided, for which +// the latest access point at or preceding that offset is located in the index. +// The input file is positioned to the specified location in the index, and if +// necessary the first few bits of the compressed data is read from the file. +// inflate is initialized with those bits and the 32K of uncompressed data, and +// decompression then proceeds until the desired offset in the file is reached. +// Then decompression continues to read the requested uncompressed data from +// the file. +// +// There is some fair bit of overhead to starting inflation for the random +// access, mainly copying the 32K byte dictionary. If small pieces of the file +// are being accessed, it would make sense to implement a cache to hold some +// lookahead to avoid many calls to deflate_index_extract() for small lengths. +// +// Another way to build an index would be to use inflateCopy(). That would not +// be constrained to have access points at block boundaries, but would require +// more memory per access point, and could not be saved to a file due to the +// use of pointers in the state. The approach here allows for storage of the +// index in a file. #include #include #include +#include #include "zlib.h" +#include "zran.h" + +#define WINSIZE 32768U // sliding window size +#define CHUNK 16384 // file input buffer size -#define local static - -#define SPAN 1048576L /* desired distance between access points */ -#define WINSIZE 32768U /* sliding window size */ -#define CHUNK 16384 /* file input buffer size */ - -/* access point entry */ -struct point { - off_t out; /* corresponding offset in uncompressed data */ - off_t in; /* offset in input file of first full byte */ - int bits; /* number of bits (1-7) from byte at in - 1, or 0 */ - unsigned char window[WINSIZE]; /* preceding 32K of uncompressed data */ -}; - -/* access point list */ -struct access { - int have; /* number of list entries filled in */ - int size; /* number of list entries allocated */ - struct point *list; /* allocated list */ -}; - -/* Deallocate an index built by build_index() */ -local void free_index(struct access *index) -{ +// See comments in zran.h. +void deflate_index_free(struct deflate_index *index) { if (index != NULL) { free(index->list); free(index); } } -/* Add an entry to the access point list. If out of memory, deallocate the - existing list and return NULL. */ -local struct access *addpoint(struct access *index, int bits, - off_t in, off_t out, unsigned left, unsigned char *window) -{ - struct point *next; - - /* if list is empty, create it (start with eight points) */ +// Add an access point to the list. If out of memory, deallocate the existing +// list and return NULL. index->mode is temporarily the allocated number of +// access points, until it is time for deflate_index_build() to return. Then +// index->mode is set to the mode of inflation. +static struct deflate_index *add_point(struct deflate_index *index, int bits, + off_t in, off_t out, unsigned left, + unsigned char *window) { if (index == NULL) { - index = malloc(sizeof(struct access)); - if (index == NULL) return NULL; - index->list = malloc(sizeof(struct point) << 3); + // The list is empty. Create it, starting with eight access points. + index = malloc(sizeof(struct deflate_index)); + if (index == NULL) + return NULL; + index->have = 0; + index->mode = 8; + index->list = malloc(sizeof(point_t) * index->mode); if (index->list == NULL) { free(index); return NULL; } - index->size = 8; - index->have = 0; } - /* if list is full, make it bigger */ - else if (index->have == index->size) { - index->size <<= 1; - next = realloc(index->list, sizeof(struct point) * index->size); + else if (index->have == index->mode) { + // The list is full. Make it bigger. + index->mode <<= 1; + point_t *next = realloc(index->list, sizeof(point_t) * index->mode); if (next == NULL) { - free_index(index); + deflate_index_free(index); return NULL; } index->list = next; } - /* fill in entry and increment how many we have */ - next = index->list + index->have; - next->bits = bits; - next->in = in; + // Fill in the access point and increment how many we have. + point_t *next = (point_t *)(index->list) + index->have++; + if (index->have < 0) { + // Overflowed the int! + deflate_index_free(index); + return NULL; + } next->out = out; + next->in = in; + next->bits = bits; if (left) memcpy(next->window, window + WINSIZE - left, left); if (left < WINSIZE) memcpy(next->window + left, window, WINSIZE - left); - index->have++; - /* return list, possibly reallocated */ + // Return the index, which may have been newly allocated or destroyed. return index; } -/* Make one entire pass through the compressed stream and build an index, with - access points about every span bytes of uncompressed output -- span is - chosen to balance the speed of random access against the memory requirements - of the list, about 32K bytes per access point. Note that data after the end - of the first zlib or gzip stream in the file is ignored. build_index() - returns the number of access points on success (>= 1), Z_MEM_ERROR for out - of memory, Z_DATA_ERROR for an error in the input file, or Z_ERRNO for a - file read error. On success, *built points to the resulting index. */ -local int build_index(FILE *in, off_t span, struct access **built) -{ - int ret; - off_t totin, totout; /* our own total counters to avoid 4GB limit */ - off_t last; /* totout value of last access point */ - struct access *index; /* access points being generated */ - z_stream strm; - unsigned char input[CHUNK]; - unsigned char window[WINSIZE]; - - /* initialize inflate */ - strm.zalloc = Z_NULL; - strm.zfree = Z_NULL; - strm.opaque = Z_NULL; - strm.avail_in = 0; - strm.next_in = Z_NULL; - ret = inflateInit2(&strm, 47); /* automatic zlib or gzip decoding */ - if (ret != Z_OK) - return ret; - - /* inflate the input, maintain a sliding window, and build an index -- this - also validates the integrity of the compressed data using the check - information at the end of the gzip or zlib stream */ - totin = totout = last = 0; - index = NULL; /* will be allocated by first addpoint() */ - strm.avail_out = 0; +// Decompression modes. These are the inflateInit2() windowBits parameter. +#define RAW -15 +#define ZLIB 15 +#define GZIP 31 + +// See comments in zran.h. +int deflate_index_build(FILE *in, off_t span, struct deflate_index **built) { + // Set up inflation state. + z_stream strm = {0}; // inflate engine (gets fired up later) + unsigned char buf[CHUNK]; // input buffer + unsigned char win[WINSIZE] = {0}; // output sliding window + off_t totin = 0; // total bytes read from input + off_t totout = 0; // total bytes uncompressed + int mode = 0; // mode: RAW, ZLIB, or GZIP (0 => not set yet) + + // Decompress from in, generating access points along the way. + int ret; // the return value from zlib, or Z_ERRNO + off_t last; // last access point uncompressed offset + struct deflate_index *index = NULL; // list of access points do { - /* get some compressed data from input file */ - strm.avail_in = fread(input, 1, CHUNK, in); - if (ferror(in)) { - ret = Z_ERRNO; - goto build_index_error; - } + // Assure available input, at least until reaching EOF. if (strm.avail_in == 0) { - ret = Z_DATA_ERROR; - goto build_index_error; - } - strm.next_in = input; - - /* process all of that, or until end of stream */ - do { - /* reset sliding window if necessary */ - if (strm.avail_out == 0) { - strm.avail_out = WINSIZE; - strm.next_out = window; - } - - /* inflate until out of input, output, or at end of block -- - update the total input and output counters */ + strm.avail_in = fread(buf, 1, sizeof(buf), in); totin += strm.avail_in; - totout += strm.avail_out; - ret = inflate(&strm, Z_BLOCK); /* return at end of block */ - totin -= strm.avail_in; - totout -= strm.avail_out; - if (ret == Z_NEED_DICT) - ret = Z_DATA_ERROR; - if (ret == Z_MEM_ERROR || ret == Z_DATA_ERROR) - goto build_index_error; - if (ret == Z_STREAM_END) + strm.next_in = buf; + if (strm.avail_in < sizeof(buf) && ferror(in)) { + ret = Z_ERRNO; break; + } - /* if at end of block, consider adding an index entry (note that if - data_type indicates an end-of-block, then all of the - uncompressed data from that block has been delivered, and none - of the compressed data after that block has been consumed, - except for up to seven bits) -- the totout == 0 provides an - entry point after the zlib or gzip header, and assures that the - index always has at least one access point; we avoid creating an - access point after the last block by checking bit 6 of data_type - */ - if ((strm.data_type & 128) && !(strm.data_type & 64) && - (totout == 0 || totout - last > span)) { - index = addpoint(index, strm.data_type & 7, totin, - totout, strm.avail_out, window); - if (index == NULL) { - ret = Z_MEM_ERROR; - goto build_index_error; - } - last = totout; + if (mode == 0) { + // At the start of the input -- determine the type. Assume raw + // if it is neither zlib nor gzip. This could in theory result + // in a false positive for zlib, but in practice the fill bits + // after a stored block are always zeros, so a raw stream won't + // start with an 8 in the low nybble. + mode = strm.avail_in == 0 ? RAW : // empty -- will fail + (strm.next_in[0] & 0xf) == 8 ? ZLIB : + strm.next_in[0] == 0x1f ? GZIP : + /* else */ RAW; + ret = inflateInit2(&strm, mode); + if (ret != Z_OK) + break; } - } while (strm.avail_in != 0); - } while (ret != Z_STREAM_END); + } - /* clean up and return index (release unused entries in list) */ - (void)inflateEnd(&strm); - index->list = realloc(index->list, sizeof(struct point) * index->have); - index->size = index->have; + // Assure available output. This rotates the output through, for use as + // a sliding window on the uncompressed data. + if (strm.avail_out == 0) { + strm.avail_out = sizeof(win); + strm.next_out = win; + } + + if (mode == RAW && index == NULL) + // We skip the inflate() call at the start of raw deflate data in + // order generate an access point there. Set data_type to imitate + // the end of a header. + strm.data_type = 0x80; + else { + // Inflate and update the number of uncompressed bytes. + unsigned before = strm.avail_out; + ret = inflate(&strm, Z_BLOCK); + totout += before - strm.avail_out; + } + + if ((strm.data_type & 0xc0) == 0x80 && + (index == NULL || totout - last >= span)) { + // We are at the end of a header or a non-last deflate block, so we + // can add an access point here. Furthermore, we are either at the + // very start for the first access point, or there has been span or + // more uncompressed bytes since the last access point, so we want + // to add an access point here. + index = add_point(index, strm.data_type & 7, totin - strm.avail_in, + totout, strm.avail_out, win); + if (index == NULL) { + ret = Z_MEM_ERROR; + break; + } + last = totout; + } + + if (ret == Z_STREAM_END && mode == GZIP && + (strm.avail_in || ungetc(getc(in), in) != EOF)) + // There is more input after the end of a gzip member. Reset the + // inflate state to read another gzip member. On success, this will + // set ret to Z_OK to continue decompressing. + ret = inflateReset2(&strm, GZIP); + + // Keep going until Z_STREAM_END or error. If the compressed data ends + // prematurely without a file read error, Z_BUF_ERROR is returned. + } while (ret == Z_OK); + inflateEnd(&strm); + + if (ret != Z_STREAM_END) { + // An error was encountered. Discard the index and return a negative + // error code. + deflate_index_free(index); + return ret == Z_NEED_DICT ? Z_DATA_ERROR : ret; + } + + // Shrink the index to only the occupied access points and return it. + index->mode = mode; + index->length = totout; + point_t *list = realloc(index->list, sizeof(point_t) * index->have); + if (list == NULL) { + // Seems like a realloc() to make something smaller should always work, + // but just in case. + deflate_index_free(index); + return Z_MEM_ERROR; + } + index->list = list; *built = index; - return index->size; - - /* return error */ - build_index_error: - (void)inflateEnd(&strm); - if (index != NULL) - free_index(index); - return ret; + return index->have; } -/* Use the index to read len bytes from offset into buf, return bytes read or - negative for error (Z_DATA_ERROR or Z_MEM_ERROR). If data is requested past - the end of the uncompressed data, then extract() will return a value less - than len, indicating how much as actually read into buf. This function - should not return a data error unless the file was modified since the index - was generated. extract() may also return Z_ERRNO if there is an error on - reading or seeking the input file. */ -local int extract(FILE *in, struct access *index, off_t offset, - unsigned char *buf, int len) -{ - int ret, skip; - z_stream strm; - struct point *here; - unsigned char input[CHUNK]; - unsigned char discard[WINSIZE]; +#ifdef NOPRIME +// Support zlib versions before 1.2.3 (July 2005), or incomplete zlib clones +// that do not have inflatePrime(). + +# define INFLATEPRIME inflatePreface + +// Append the low bits bits of value to in[] at bit position *have, updating +// *have. value must be zero above its low bits bits. bits must be positive. +// This assumes that any bits above the *have bits in the last byte are zeros. +// That assumption is preserved on return, as any bits above *have + bits in +// the last byte written will be set to zeros. +static inline void append_bits(unsigned value, int bits, + unsigned char *in, int *have) { + in += *have >> 3; // where the first bits from value will go + int k = *have & 7; // the number of bits already there + *have += bits; + if (k) + *in |= value << k; // write value above the low k bits + else + *in = value; + k = 8 - k; // the number of bits just appended + while (bits > k) { + value >>= k; // drop the bits appended + bits -= k; + k = 8; // now at a byte boundary + *++in = value; + } +} + +// Insert enough bits in the form of empty deflate blocks in front of the +// low bits bits of value, in order to bring the sequence to a byte boundary. +// Then feed that to inflate(). This does what inflatePrime() does, except that +// a negative value of bits is not supported. bits must be in 0..16. If the +// arguments are invalid, Z_STREAM_ERROR is returned. Otherwise the return +// value from inflate() is returned. +static int inflatePreface(z_stream *strm, int bits, int value) { + // Check input. + if (strm == Z_NULL || bits < 0 || bits > 16) + return Z_STREAM_ERROR; + if (bits == 0) + return Z_OK; + value &= (2 << (bits - 1)) - 1; + + // An empty dynamic block with an odd number of bits (95). The high bit of + // the last byte is unused. + static const unsigned char dyn[] = { + 4, 0xe0, 0x81, 8, 0, 0, 0, 0, 0x20, 0xa8, 0xab, 0x1f + }; + const int dynlen = 95; // number of bits in the block + + // Build an input buffer for inflate that is a multiple of eight bits in + // length, and that ends with the low bits bits of value. + unsigned char in[(dynlen + 3 * 10 + 16 + 7) / 8]; + int have = 0; + if (bits & 1) { + // Insert an empty dynamic block to get to an odd number of bits, so + // when bits bits from value are appended, we are at an even number of + // bits. + memcpy(in, dyn, sizeof(dyn)); + have = dynlen; + } + while ((have + bits) & 7) + // Insert empty fixed blocks until appending bits bits would put us on + // a byte boundary. This will insert at most three fixed blocks. + append_bits(2, 10, in, &have); + + // Append the bits bits from value, which takes us to a byte boundary. + append_bits(value, bits, in, &have); + + // Deliver the input to inflate(). There is no output space provided, but + // inflate() can't get stuck waiting on output not ingesting all of the + // provided input. The reason is that there will be at most 16 bits of + // input from value after the empty deflate blocks (which themselves + // generate no output). At least ten bits are needed to generate the first + // output byte from a fixed block. The last two bytes of the buffer have to + // be ingested in order to get ten bits, which is the most that value can + // occupy. + strm->avail_in = have >> 3; + strm->next_in = in; + strm->avail_out = 0; + strm->next_out = in; // not used, but can't be NULL + return inflate(strm, Z_NO_FLUSH); +} - /* proceed only if something reasonable to do */ - if (len < 0) +#else +# define INFLATEPRIME inflatePrime +#endif + +// See comments in zran.h. +ptrdiff_t deflate_index_extract(FILE *in, struct deflate_index *index, + off_t offset, unsigned char *buf, size_t len) { + // Do a quick sanity check on the index. + if (index == NULL || index->have < 1 || index->list[0].out != 0) + return Z_STREAM_ERROR; + + // If nothing to extract, return zero bytes extracted. + if (len == 0 || offset < 0 || offset >= index->length) return 0; - /* find where in stream to start */ - here = index->list; - ret = index->have; - while (--ret && here[1].out <= offset) - here++; - - /* initialize file and inflate state to start there */ - strm.zalloc = Z_NULL; - strm.zfree = Z_NULL; - strm.opaque = Z_NULL; - strm.avail_in = 0; - strm.next_in = Z_NULL; - ret = inflateInit2(&strm, -15); /* raw inflate */ + // Find the access point closest to but not after offset. + int lo = -1, hi = index->have; + point_t *point = index->list; + while (hi - lo > 1) { + int mid = (lo + hi) >> 1; + if (offset < point[mid].out) + hi = mid; + else + lo = mid; + } + point += lo; + + // Initialize the input file and prime the inflate engine to start there. + int ret = fseeko(in, point->in - (point->bits ? 1 : 0), SEEK_SET); + if (ret == -1) + return Z_ERRNO; + int ch = 0; + if (point->bits && (ch = getc(in)) == EOF) + return ferror(in) ? Z_ERRNO : Z_BUF_ERROR; + z_stream strm = {0}; + ret = inflateInit2(&strm, RAW); if (ret != Z_OK) return ret; - ret = fseeko(in, here->in - (here->bits ? 1 : 0), SEEK_SET); - if (ret == -1) - goto extract_ret; - if (here->bits) { - ret = getc(in); - if (ret == -1) { - ret = ferror(in) ? Z_ERRNO : Z_DATA_ERROR; - goto extract_ret; - } - (void)inflatePrime(&strm, here->bits, ret >> (8 - here->bits)); - } - (void)inflateSetDictionary(&strm, here->window, WINSIZE); + if (point->bits) + INFLATEPRIME(&strm, point->bits, ch >> (8 - point->bits)); + inflateSetDictionary(&strm, point->window, WINSIZE); - /* skip uncompressed bytes until offset reached, then satisfy request */ - offset -= here->out; - strm.avail_in = 0; - skip = 1; /* while skipping to offset */ + // Skip uncompressed bytes until offset reached, then satisfy request. + unsigned char input[CHUNK]; + unsigned char discard[WINSIZE]; + offset -= point->out; // number of bytes to skip to get to offset + size_t left = len; // number of bytes left to read after offset do { - /* define where to put uncompressed data, and how much */ - if (offset == 0 && skip) { /* at offset now */ - strm.avail_out = len; - strm.next_out = buf; - skip = 0; /* only do this once */ - } - if (offset > WINSIZE) { /* skip WINSIZE bytes */ - strm.avail_out = WINSIZE; + if (offset) { + // Discard up to offset uncompressed bytes. + strm.avail_out = offset < WINSIZE ? (unsigned)offset : WINSIZE; strm.next_out = discard; - offset -= WINSIZE; } - else if (offset != 0) { /* last skip */ - strm.avail_out = (unsigned)offset; - strm.next_out = discard; - offset = 0; + else { + // Uncompress up to left bytes into buf. + strm.avail_out = left < UINT_MAX ? (unsigned)left : UINT_MAX; + strm.next_out = buf + len - left; } - /* uncompress until avail_out filled, or end of stream */ - do { - if (strm.avail_in == 0) { - strm.avail_in = fread(input, 1, CHUNK, in); - if (ferror(in)) { - ret = Z_ERRNO; - goto extract_ret; - } - if (strm.avail_in == 0) { - ret = Z_DATA_ERROR; - goto extract_ret; - } - strm.next_in = input; - } - ret = inflate(&strm, Z_NO_FLUSH); /* normal inflate */ - if (ret == Z_NEED_DICT) - ret = Z_DATA_ERROR; - if (ret == Z_MEM_ERROR || ret == Z_DATA_ERROR) - goto extract_ret; - if (ret == Z_STREAM_END) + // Uncompress, setting got to the number of bytes uncompressed. + if (strm.avail_in == 0) { + // Assure available input. + strm.avail_in = fread(input, 1, CHUNK, in); + if (strm.avail_in < CHUNK && ferror(in)) { + ret = Z_ERRNO; break; - } while (strm.avail_out != 0); - - /* if reach end of stream, then don't keep trying to get more */ - if (ret == Z_STREAM_END) - break; + } + strm.next_in = input; + } + unsigned got = strm.avail_out; + ret = inflate(&strm, Z_NO_FLUSH); + got -= strm.avail_out; + + // Update the appropriate count. + if (offset) + offset -= got; + else + left -= got; + + // If we're at the end of a gzip member and there's more to read, + // continue to the next gzip member. + if (ret == Z_STREAM_END && index->mode == GZIP) { + // Discard the gzip trailer. + unsigned drop = 8; // length of gzip trailer + if (strm.avail_in >= drop) { + strm.avail_in -= drop; + strm.next_in += drop; + } + else { + // Read and discard the remainder of the gzip trailer. + drop -= strm.avail_in; + strm.avail_in = 0; + do { + if (getc(in) == EOF) + // The input does not have a complete trailer. + return ferror(in) ? Z_ERRNO : Z_BUF_ERROR; + } while (--drop); + } - /* do until offset reached and requested data read, or stream ends */ - } while (skip); + if (strm.avail_in || ungetc(getc(in), in) != EOF) { + // There's more after the gzip trailer. Use inflate to skip the + // gzip header and resume the raw inflate there. + inflateReset2(&strm, GZIP); + do { + if (strm.avail_in == 0) { + strm.avail_in = fread(input, 1, CHUNK, in); + if (strm.avail_in < CHUNK && ferror(in)) { + ret = Z_ERRNO; + break; + } + strm.next_in = input; + } + strm.avail_out = WINSIZE; + strm.next_out = discard; + ret = inflate(&strm, Z_BLOCK); // stop at end of header + } while (ret == Z_OK && (strm.data_type & 0x80) == 0); + if (ret != Z_OK) + break; + inflateReset2(&strm, RAW); + } + } - /* compute number of uncompressed bytes read after offset */ - ret = skip ? 0 : len - strm.avail_out; + // Continue until we have the requested data, the deflate data has + // ended, or an error is encountered. + } while (ret == Z_OK && left); + inflateEnd(&strm); - /* clean up and return bytes read or error */ - extract_ret: - (void)inflateEnd(&strm); - return ret; + // Return the number of uncompressed bytes read into buf, or the error. + return ret == Z_OK || ret == Z_STREAM_END ? len - left : ret; } -/* Demonstrate the use of build_index() and extract() by processing the file - provided on the command line, and the extracting 16K from about 2/3rds of - the way through the uncompressed output, and writing that to stdout. */ -int main(int argc, char **argv) -{ - int len; - off_t offset; - FILE *in; - struct access *index = NULL; - unsigned char buf[CHUNK]; - - /* open input file */ - if (argc != 2) { - fprintf(stderr, "usage: zran file.gz\n"); +#ifdef TEST + +#define SPAN 1048576L // desired distance between access points +#define LEN 16384 // number of bytes to extract + +// Demonstrate the use of deflate_index_build() and deflate_index_extract() by +// processing the file provided on the command line, and extracting LEN bytes +// from 2/3rds of the way through the uncompressed output, writing that to +// stdout. An offset can be provided as the second argument, in which case the +// data is extracted from there instead. +int main(int argc, char **argv) { + // Open the input file. + if (argc < 2 || argc > 3) { + fprintf(stderr, "usage: zran file.raw [offset]\n"); return 1; } - in = fopen(argv[1], "rb"); + FILE *in = fopen(argv[1], "rb"); if (in == NULL) { fprintf(stderr, "zran: could not open %s for reading\n", argv[1]); return 1; } - /* build index */ - len = build_index(in, SPAN, &index); + // Get optional offset. + off_t offset = -1; + if (argc == 3) { + char *end; + offset = strtoll(argv[2], &end, 10); + if (*end || offset < 0) { + fprintf(stderr, "zran: %s is not a valid offset\n", argv[2]); + return 1; + } + } + + // Build index. + struct deflate_index *index = NULL; + int len = deflate_index_build(in, SPAN, &index); if (len < 0) { fclose(in); switch (len) { case Z_MEM_ERROR: fprintf(stderr, "zran: out of memory\n"); break; + case Z_BUF_ERROR: + fprintf(stderr, "zran: %s ended prematurely\n", argv[1]); + break; case Z_DATA_ERROR: fprintf(stderr, "zran: compressed data error in %s\n", argv[1]); break; @@ -391,19 +511,23 @@ int main(int argc, char **argv) } fprintf(stderr, "zran: built index with %d access points\n", len); - /* use index by reading some bytes from an arbitrary offset */ - offset = (index->list[index->have - 1].out << 1) / 3; - len = extract(in, index, offset, buf, CHUNK); - if (len < 0) + // Use index by reading some bytes from an arbitrary offset. + unsigned char buf[LEN]; + if (offset == -1) + offset = ((index->length + 1) << 1) / 3; + ptrdiff_t got = deflate_index_extract(in, index, offset, buf, LEN); + if (got < 0) fprintf(stderr, "zran: extraction failed: %s error\n", - len == Z_MEM_ERROR ? "out of memory" : "input corrupted"); + got == Z_MEM_ERROR ? "out of memory" : "input corrupted"); else { - fwrite(buf, 1, len, stdout); - fprintf(stderr, "zran: extracted %d bytes at %llu\n", len, offset); + fwrite(buf, 1, got, stdout); + fprintf(stderr, "zran: extracted %ld bytes at %lld\n", got, offset); } - /* clean up and exit */ - free_index(index); + // Clean up and exit. + deflate_index_free(index); fclose(in); return 0; } + +#endif diff --git a/zlib/examples/zran.h b/zlib/examples/zran.h new file mode 100644 index 000000000000..ebf780d0c1f1 --- /dev/null +++ b/zlib/examples/zran.h @@ -0,0 +1,51 @@ +/* zran.h -- example of deflated stream indexing and random access + * Copyright (C) 2005, 2012, 2018, 2023 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + * Version 1.3 18 Feb 2023 Mark Adler */ + +#include +#include "zlib.h" + +// Access point. +typedef struct point { + off_t out; // offset in uncompressed data + off_t in; // offset in compressed file of first full byte + int bits; // 0, or number of bits (1-7) from byte at in-1 + unsigned char window[32768]; // preceding 32K of uncompressed data +} point_t; + +// Access point list. +struct deflate_index { + int have; // number of access points in list + int mode; // -15 for raw, 15 for zlib, or 31 for gzip + off_t length; // total length of uncompressed data + point_t *list; // allocated list of access points +}; + +// Make one pass through a zlib, gzip, or raw deflate compressed stream and +// build an index, with access points about every span bytes of uncompressed +// output. gzip files with multiple members are fully indexed. span should be +// chosen to balance the speed of random access against the memory requirements +// of the list, which is about 32K bytes per access point. The return value is +// the number of access points on success (>= 1), Z_MEM_ERROR for out of +// memory, Z_BUF_ERROR for a premature end of input, Z_DATA_ERROR for a format +// or verification error in the input file, or Z_ERRNO for a file read error. +// On success, *built points to the resulting index. +int deflate_index_build(FILE *in, off_t span, struct deflate_index **built); + +// Use the index to read len bytes from offset into buf. Return the number of +// bytes read or a negative error code. If data is requested past the end of +// the uncompressed data, then deflate_index_extract() will return a value less +// than len, indicating how much was actually read into buf. If given a valid +// index, this function should not return an error unless the file was modified +// somehow since the index was generated, given that deflate_index_build() had +// validated all of the input. If nevertheless there is a failure, Z_BUF_ERROR +// is returned if the compressed data ends prematurely, Z_DATA_ERROR if the +// deflate compressed data is not valid, Z_MEM_ERROR if out of memory, +// Z_STREAM_ERROR if the index is not valid, or Z_ERRNO if there is an error +// reading or seeking on the input file. +ptrdiff_t deflate_index_extract(FILE *in, struct deflate_index *index, + off_t offset, unsigned char *buf, size_t len); + +// Deallocate an index built by deflate_index_build(). +void deflate_index_free(struct deflate_index *index); diff --git a/zlib/gzclose.c b/zlib/gzclose.c index caeb99a3177f..48d6a86f04b6 100644 --- a/zlib/gzclose.c +++ b/zlib/gzclose.c @@ -8,9 +8,7 @@ /* gzclose() is in a separate file so that it is linked in only if it is used. That way the other gzclose functions can be used instead to avoid linking in unneeded compression or decompression routines. */ -int ZEXPORT gzclose(file) - gzFile file; -{ +int ZEXPORT gzclose(gzFile file) { #ifndef NO_GZCOMPRESS gz_statep state; diff --git a/zlib/gzguts.h b/zlib/gzguts.h index 6378d468a258..eba72085bb75 100644 --- a/zlib/gzguts.h +++ b/zlib/gzguts.h @@ -1,5 +1,5 @@ /* gzguts.h -- zlib internal header definitions for gz* operations - * Copyright (C) 2004, 2005, 2010, 2011, 2012, 2013, 2016 Mark Adler + * Copyright (C) 2004-2024 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -7,9 +7,8 @@ # ifndef _LARGEFILE_SOURCE # define _LARGEFILE_SOURCE 1 # endif -# ifdef _FILE_OFFSET_BITS -# undef _FILE_OFFSET_BITS -# endif +# undef _FILE_OFFSET_BITS +# undef _TIME_BITS #endif #ifdef HAVE_HIDDEN @@ -119,8 +118,8 @@ /* gz* functions always use library allocation functions */ #ifndef STDC - extern voidp malloc OF((uInt size)); - extern void free OF((voidpf ptr)); + extern voidp malloc(uInt size); + extern void free(voidpf ptr); #endif /* get errno and strerror definition */ @@ -138,10 +137,10 @@ /* provide prototypes for these when building zlib without LFS */ #if !defined(_LARGEFILE64_SOURCE) || _LFS64_LARGEFILE-0 == 0 - ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *)); - ZEXTERN z_off64_t ZEXPORT gzseek64 OF((gzFile, z_off64_t, int)); - ZEXTERN z_off64_t ZEXPORT gztell64 OF((gzFile)); - ZEXTERN z_off64_t ZEXPORT gzoffset64 OF((gzFile)); + ZEXTERN gzFile ZEXPORT gzopen64(const char *, const char *); + ZEXTERN z_off64_t ZEXPORT gzseek64(gzFile, z_off64_t, int); + ZEXTERN z_off64_t ZEXPORT gztell64(gzFile); + ZEXTERN z_off64_t ZEXPORT gzoffset64(gzFile); #endif /* default memLevel */ @@ -190,6 +189,7 @@ typedef struct { /* just for writing */ int level; /* compression level */ int strategy; /* compression strategy */ + int reset; /* true if a reset is pending after a Z_FINISH */ /* seek request */ z_off64_t skip; /* amount to skip (already rewound if backwards) */ int seek; /* true if seek request pending */ @@ -202,17 +202,13 @@ typedef struct { typedef gz_state FAR *gz_statep; /* shared functions */ -void ZLIB_INTERNAL gz_error OF((gz_statep, int, const char *)); +void ZLIB_INTERNAL gz_error(gz_statep, int, const char *); #if defined UNDER_CE -char ZLIB_INTERNAL *gz_strwinerror OF((DWORD error)); +char ZLIB_INTERNAL *gz_strwinerror(DWORD error); #endif /* GT_OFF(x), where x is an unsigned value, is true if x > maximum z_off64_t value -- needed when comparing unsigned to z_off64_t, which is signed (possible z_off64_t types off_t, off64_t, and long are all signed) */ -#ifdef INT_MAX -# define GT_OFF(x) (sizeof(int) == sizeof(z_off64_t) && (x) > INT_MAX) -#else -unsigned ZLIB_INTERNAL gz_intmax OF((void)); -# define GT_OFF(x) (sizeof(int) == sizeof(z_off64_t) && (x) > gz_intmax()) -#endif +unsigned ZLIB_INTERNAL gz_intmax(void); +#define GT_OFF(x) (sizeof(int) == sizeof(z_off64_t) && (x) > gz_intmax()) diff --git a/zlib/gzlib.c b/zlib/gzlib.c index 4105e6aff925..983153cc8e49 100644 --- a/zlib/gzlib.c +++ b/zlib/gzlib.c @@ -1,11 +1,11 @@ /* gzlib.c -- zlib functions common to reading and writing gzip files - * Copyright (C) 2004-2017 Mark Adler + * Copyright (C) 2004-2024 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ #include "gzguts.h" -#if defined(_WIN32) && !defined(__BORLANDC__) && !defined(__MINGW32__) +#if defined(_WIN32) && !defined(__BORLANDC__) # define LSEEK _lseeki64 #else #if defined(_LARGEFILE64_SOURCE) && _LFS64_LARGEFILE-0 @@ -15,10 +15,6 @@ #endif #endif -/* Local functions */ -local void gz_reset OF((gz_statep)); -local gzFile gz_open OF((const void *, int, const char *)); - #if defined UNDER_CE /* Map the Windows error number in ERROR to a locale-dependent error message @@ -30,9 +26,7 @@ local gzFile gz_open OF((const void *, int, const char *)); The gz_strwinerror function does not change the current setting of GetLastError. */ -char ZLIB_INTERNAL *gz_strwinerror (error) - DWORD error; -{ +char ZLIB_INTERNAL *gz_strwinerror(DWORD error) { static char buf[1024]; wchar_t *msgbuf; @@ -72,15 +66,15 @@ char ZLIB_INTERNAL *gz_strwinerror (error) #endif /* UNDER_CE */ /* Reset gzip file state */ -local void gz_reset(state) - gz_statep state; -{ +local void gz_reset(gz_statep state) { state->x.have = 0; /* no output data available */ if (state->mode == GZ_READ) { /* for reading ... */ state->eof = 0; /* not at end of file */ state->past = 0; /* have not read past end yet */ state->how = LOOK; /* look for gzip header */ } + else /* for writing ... */ + state->reset = 0; /* no deflateReset pending */ state->seek = 0; /* no seek request pending */ gz_error(state, Z_OK, NULL); /* clear error */ state->x.pos = 0; /* no uncompressed data yet */ @@ -88,11 +82,7 @@ local void gz_reset(state) } /* Open a gzip file either by name or file descriptor. */ -local gzFile gz_open(path, fd, mode) - const void *path; - int fd; - const char *mode; -{ +local gzFile gz_open(const void *path, int fd, const char *mode) { gz_statep state; z_size_t len; int oflag; @@ -267,26 +257,17 @@ local gzFile gz_open(path, fd, mode) } /* -- see zlib.h -- */ -gzFile ZEXPORT gzopen(path, mode) - const char *path; - const char *mode; -{ +gzFile ZEXPORT gzopen(const char *path, const char *mode) { return gz_open(path, -1, mode); } /* -- see zlib.h -- */ -gzFile ZEXPORT gzopen64(path, mode) - const char *path; - const char *mode; -{ +gzFile ZEXPORT gzopen64(const char *path, const char *mode) { return gz_open(path, -1, mode); } /* -- see zlib.h -- */ -gzFile ZEXPORT gzdopen(fd, mode) - int fd; - const char *mode; -{ +gzFile ZEXPORT gzdopen(int fd, const char *mode) { char *path; /* identifier for error messages */ gzFile gz; @@ -304,19 +285,13 @@ gzFile ZEXPORT gzdopen(fd, mode) /* -- see zlib.h -- */ #ifdef WIDECHAR -gzFile ZEXPORT gzopen_w(path, mode) - const wchar_t *path; - const char *mode; -{ +gzFile ZEXPORT gzopen_w(const wchar_t *path, const char *mode) { return gz_open(path, -2, mode); } #endif /* -- see zlib.h -- */ -int ZEXPORT gzbuffer(file, size) - gzFile file; - unsigned size; -{ +int ZEXPORT gzbuffer(gzFile file, unsigned size) { gz_statep state; /* get internal structure and check integrity */ @@ -333,16 +308,14 @@ int ZEXPORT gzbuffer(file, size) /* check and set requested size */ if ((size << 1) < size) return -1; /* need to be able to double it */ - if (size < 2) - size = 2; /* need two bytes to check magic header */ + if (size < 8) + size = 8; /* needed to behave well with flushing */ state->want = size; return 0; } /* -- see zlib.h -- */ -int ZEXPORT gzrewind(file) - gzFile file; -{ +int ZEXPORT gzrewind(gzFile file) { gz_statep state; /* get internal structure */ @@ -363,11 +336,7 @@ int ZEXPORT gzrewind(file) } /* -- see zlib.h -- */ -z_off64_t ZEXPORT gzseek64(file, offset, whence) - gzFile file; - z_off64_t offset; - int whence; -{ +z_off64_t ZEXPORT gzseek64(gzFile file, z_off64_t offset, int whence) { unsigned n; z_off64_t ret; gz_statep state; @@ -397,7 +366,7 @@ z_off64_t ZEXPORT gzseek64(file, offset, whence) /* if within raw area while reading, just go there */ if (state->mode == GZ_READ && state->how == COPY && state->x.pos + offset >= 0) { - ret = LSEEK(state->fd, offset - state->x.have, SEEK_CUR); + ret = LSEEK(state->fd, offset - (z_off64_t)state->x.have, SEEK_CUR); if (ret == -1) return -1; state->x.have = 0; @@ -440,11 +409,7 @@ z_off64_t ZEXPORT gzseek64(file, offset, whence) } /* -- see zlib.h -- */ -z_off_t ZEXPORT gzseek(file, offset, whence) - gzFile file; - z_off_t offset; - int whence; -{ +z_off_t ZEXPORT gzseek(gzFile file, z_off_t offset, int whence) { z_off64_t ret; ret = gzseek64(file, (z_off64_t)offset, whence); @@ -452,9 +417,7 @@ z_off_t ZEXPORT gzseek(file, offset, whence) } /* -- see zlib.h -- */ -z_off64_t ZEXPORT gztell64(file) - gzFile file; -{ +z_off64_t ZEXPORT gztell64(gzFile file) { gz_statep state; /* get internal structure and check integrity */ @@ -469,9 +432,7 @@ z_off64_t ZEXPORT gztell64(file) } /* -- see zlib.h -- */ -z_off_t ZEXPORT gztell(file) - gzFile file; -{ +z_off_t ZEXPORT gztell(gzFile file) { z_off64_t ret; ret = gztell64(file); @@ -479,9 +440,7 @@ z_off_t ZEXPORT gztell(file) } /* -- see zlib.h -- */ -z_off64_t ZEXPORT gzoffset64(file) - gzFile file; -{ +z_off64_t ZEXPORT gzoffset64(gzFile file) { z_off64_t offset; gz_statep state; @@ -502,9 +461,7 @@ z_off64_t ZEXPORT gzoffset64(file) } /* -- see zlib.h -- */ -z_off_t ZEXPORT gzoffset(file) - gzFile file; -{ +z_off_t ZEXPORT gzoffset(gzFile file) { z_off64_t ret; ret = gzoffset64(file); @@ -512,9 +469,7 @@ z_off_t ZEXPORT gzoffset(file) } /* -- see zlib.h -- */ -int ZEXPORT gzeof(file) - gzFile file; -{ +int ZEXPORT gzeof(gzFile file) { gz_statep state; /* get internal structure and check integrity */ @@ -529,10 +484,7 @@ int ZEXPORT gzeof(file) } /* -- see zlib.h -- */ -const char * ZEXPORT gzerror(file, errnum) - gzFile file; - int *errnum; -{ +const char * ZEXPORT gzerror(gzFile file, int *errnum) { gz_statep state; /* get internal structure and check integrity */ @@ -550,9 +502,7 @@ const char * ZEXPORT gzerror(file, errnum) } /* -- see zlib.h -- */ -void ZEXPORT gzclearerr(file) - gzFile file; -{ +void ZEXPORT gzclearerr(gzFile file) { gz_statep state; /* get internal structure and check integrity */ @@ -576,11 +526,7 @@ void ZEXPORT gzclearerr(file) memory). Simply save the error message as a static string. If there is an allocation failure constructing the error message, then convert the error to out of memory. */ -void ZLIB_INTERNAL gz_error(state, err, msg) - gz_statep state; - int err; - const char *msg; -{ +void ZLIB_INTERNAL gz_error(gz_statep state, int err, const char *msg) { /* free previously allocated message and clear */ if (state->msg != NULL) { if (state->err != Z_MEM_ERROR) @@ -617,21 +563,20 @@ void ZLIB_INTERNAL gz_error(state, err, msg) #endif } -#ifndef INT_MAX /* portably return maximum value for an int (when limits.h presumed not available) -- we need to do this to cover cases where 2's complement not used, since C standard permits 1's complement and sign-bit representations, otherwise we could just use ((unsigned)-1) >> 1 */ -unsigned ZLIB_INTERNAL gz_intmax() -{ - unsigned p, q; - - p = 1; +unsigned ZLIB_INTERNAL gz_intmax(void) { +#ifdef INT_MAX + return INT_MAX; +#else + unsigned p = 1, q; do { q = p; p <<= 1; p++; } while (p > q); return q >> 1; -} #endif +} diff --git a/zlib/gzread.c b/zlib/gzread.c index 956b91ea7d9e..4168cbc88752 100644 --- a/zlib/gzread.c +++ b/zlib/gzread.c @@ -1,29 +1,16 @@ /* gzread.c -- zlib functions for reading gzip files - * Copyright (C) 2004, 2005, 2010, 2011, 2012, 2013, 2016 Mark Adler + * Copyright (C) 2004-2017 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ #include "gzguts.h" -/* Local functions */ -local int gz_load OF((gz_statep, unsigned char *, unsigned, unsigned *)); -local int gz_avail OF((gz_statep)); -local int gz_look OF((gz_statep)); -local int gz_decomp OF((gz_statep)); -local int gz_fetch OF((gz_statep)); -local int gz_skip OF((gz_statep, z_off64_t)); -local z_size_t gz_read OF((gz_statep, voidp, z_size_t)); - /* Use read() to load a buffer -- return -1 on error, otherwise 0. Read from state->fd, and update state->eof, state->err, and state->msg as appropriate. This function needs to loop on read(), since read() is not guaranteed to read the number of bytes requested, depending on the type of descriptor. */ -local int gz_load(state, buf, len, have) - gz_statep state; - unsigned char *buf; - unsigned len; - unsigned *have; -{ +local int gz_load(gz_statep state, unsigned char *buf, unsigned len, + unsigned *have) { int ret; unsigned get, max = ((unsigned)-1 >> 2) + 1; @@ -53,9 +40,7 @@ local int gz_load(state, buf, len, have) If strm->avail_in != 0, then the current data is moved to the beginning of the input buffer, and then the remainder of the buffer is loaded with the available data from the input file. */ -local int gz_avail(state) - gz_statep state; -{ +local int gz_avail(gz_statep state) { unsigned got; z_streamp strm = &(state->strm); @@ -88,9 +73,7 @@ local int gz_avail(state) case, all further file reads will be directly to either the output buffer or a user buffer. If decompressing, the inflate state will be initialized. gz_look() will return 0 on success or -1 on failure. */ -local int gz_look(state) - gz_statep state; -{ +local int gz_look(gz_statep state) { z_streamp strm = &(state->strm); /* allocate read buffers and inflate memory */ @@ -157,11 +140,9 @@ local int gz_look(state) the output buffer is larger than the input buffer, which also assures space for gzungetc() */ state->x.next = state->out; - if (strm->avail_in) { - memcpy(state->x.next, strm->next_in, strm->avail_in); - state->x.have = strm->avail_in; - strm->avail_in = 0; - } + memcpy(state->x.next, strm->next_in, strm->avail_in); + state->x.have = strm->avail_in; + strm->avail_in = 0; state->how = COPY; state->direct = 1; return 0; @@ -172,9 +153,7 @@ local int gz_look(state) data. If the gzip stream completes, state->how is reset to LOOK to look for the next gzip stream or raw data, once state->x.have is depleted. Returns 0 on success, -1 on failure. */ -local int gz_decomp(state) - gz_statep state; -{ +local int gz_decomp(gz_statep state) { int ret = Z_OK; unsigned had; z_streamp strm = &(state->strm); @@ -226,9 +205,7 @@ local int gz_decomp(state) looked for to determine whether to copy or decompress. Returns -1 on error, otherwise 0. gz_fetch() will leave state->how as COPY or GZIP unless the end of the input file has been reached and all data has been processed. */ -local int gz_fetch(state) - gz_statep state; -{ +local int gz_fetch(gz_statep state) { z_streamp strm = &(state->strm); do { @@ -256,10 +233,7 @@ local int gz_fetch(state) } /* Skip len uncompressed bytes of output. Return -1 on error, 0 on success. */ -local int gz_skip(state, len) - gz_statep state; - z_off64_t len; -{ +local int gz_skip(gz_statep state, z_off64_t len) { unsigned n; /* skip over len bytes or reach end-of-file, whichever comes first */ @@ -291,11 +265,7 @@ local int gz_skip(state, len) input. Return the number of bytes read. If zero is returned, either the end of file was reached, or there was an error. state->err must be consulted in that case to determine which. */ -local z_size_t gz_read(state, buf, len) - gz_statep state; - voidp buf; - z_size_t len; -{ +local z_size_t gz_read(gz_statep state, voidp buf, z_size_t len) { z_size_t got; unsigned n; @@ -314,9 +284,9 @@ local z_size_t gz_read(state, buf, len) got = 0; do { /* set n to the maximum amount of len that fits in an unsigned int */ - n = -1; + n = (unsigned)-1; if (n > len) - n = len; + n = (unsigned)len; /* first just try copying data from the output buffer */ if (state->x.have) { @@ -372,11 +342,7 @@ local z_size_t gz_read(state, buf, len) } /* -- see zlib.h -- */ -int ZEXPORT gzread(file, buf, len) - gzFile file; - voidp buf; - unsigned len; -{ +int ZEXPORT gzread(gzFile file, voidp buf, unsigned len) { gz_statep state; /* get internal structure */ @@ -397,7 +363,7 @@ int ZEXPORT gzread(file, buf, len) } /* read len or fewer bytes to buf */ - len = gz_read(state, buf, len); + len = (unsigned)gz_read(state, buf, len); /* check for an error */ if (len == 0 && state->err != Z_OK && state->err != Z_BUF_ERROR) @@ -408,12 +374,7 @@ int ZEXPORT gzread(file, buf, len) } /* -- see zlib.h -- */ -z_size_t ZEXPORT gzfread(buf, size, nitems, file) - voidp buf; - z_size_t size; - z_size_t nitems; - gzFile file; -{ +z_size_t ZEXPORT gzfread(voidp buf, z_size_t size, z_size_t nitems, gzFile file) { z_size_t len; gz_statep state; @@ -444,10 +405,7 @@ z_size_t ZEXPORT gzfread(buf, size, nitems, file) #else # undef gzgetc #endif -int ZEXPORT gzgetc(file) - gzFile file; -{ - int ret; +int ZEXPORT gzgetc(gzFile file) { unsigned char buf[1]; gz_statep state; @@ -469,21 +427,15 @@ int ZEXPORT gzgetc(file) } /* nothing there -- try gz_read() */ - ret = gz_read(state, buf, 1); - return ret < 1 ? -1 : buf[0]; + return gz_read(state, buf, 1) < 1 ? -1 : buf[0]; } -int ZEXPORT gzgetc_(file) -gzFile file; -{ +int ZEXPORT gzgetc_(gzFile file) { return gzgetc(file); } /* -- see zlib.h -- */ -int ZEXPORT gzungetc(c, file) - int c; - gzFile file; -{ +int ZEXPORT gzungetc(int c, gzFile file) { gz_statep state; /* get internal structure */ @@ -491,6 +443,10 @@ int ZEXPORT gzungetc(c, file) return -1; state = (gz_statep)file; + /* in case this was just opened, set up the input buffer */ + if (state->mode == GZ_READ && state->how == LOOK && state->x.have == 0) + (void)gz_look(state); + /* check that we're reading and that there's no (serious) error */ if (state->mode != GZ_READ || (state->err != Z_OK && state->err != Z_BUF_ERROR)) @@ -540,11 +496,7 @@ int ZEXPORT gzungetc(c, file) } /* -- see zlib.h -- */ -char * ZEXPORT gzgets(file, buf, len) - gzFile file; - char *buf; - int len; -{ +char * ZEXPORT gzgets(gzFile file, char *buf, int len) { unsigned left, n; char *str; unsigned char *eol; @@ -604,9 +556,7 @@ char * ZEXPORT gzgets(file, buf, len) } /* -- see zlib.h -- */ -int ZEXPORT gzdirect(file) - gzFile file; -{ +int ZEXPORT gzdirect(gzFile file) { gz_statep state; /* get internal structure */ @@ -624,9 +574,7 @@ int ZEXPORT gzdirect(file) } /* -- see zlib.h -- */ -int ZEXPORT gzclose_r(file) - gzFile file; -{ +int ZEXPORT gzclose_r(gzFile file) { int ret, err; gz_statep state; diff --git a/zlib/gzwrite.c b/zlib/gzwrite.c index c7b5651d70b9..435b4621b534 100644 --- a/zlib/gzwrite.c +++ b/zlib/gzwrite.c @@ -1,22 +1,14 @@ /* gzwrite.c -- zlib functions for writing gzip files - * Copyright (C) 2004-2017 Mark Adler + * Copyright (C) 2004-2019 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ #include "gzguts.h" -/* Local functions */ -local int gz_init OF((gz_statep)); -local int gz_comp OF((gz_statep, int)); -local int gz_zero OF((gz_statep, z_off64_t)); -local z_size_t gz_write OF((gz_statep, voidpc, z_size_t)); - /* Initialize state for writing a gzip file. Mark initialization by setting state->size to non-zero. Return -1 on a memory allocation failure, or 0 on success. */ -local int gz_init(state) - gz_statep state; -{ +local int gz_init(gz_statep state) { int ret; z_streamp strm = &(state->strm); @@ -70,10 +62,7 @@ local int gz_init(state) deflate() flush value. If flush is Z_FINISH, then the deflate() state is reset to start a new gzip stream. If gz->direct is true, then simply write to the output file without compressing, and ignore flush. */ -local int gz_comp(state, flush) - gz_statep state; - int flush; -{ +local int gz_comp(gz_statep state, int flush) { int ret, writ; unsigned have, put, max = ((unsigned)-1 >> 2) + 1; z_streamp strm = &(state->strm); @@ -97,6 +86,15 @@ local int gz_comp(state, flush) return 0; } + /* check for a pending reset */ + if (state->reset) { + /* don't start a new gzip member unless there is data to write */ + if (strm->avail_in == 0) + return 0; + deflateReset(strm); + state->reset = 0; + } + /* run deflate() on provided input until it produces no more output */ ret = Z_OK; do { @@ -134,7 +132,7 @@ local int gz_comp(state, flush) /* if that completed a deflate stream, allow another to start */ if (flush == Z_FINISH) - deflateReset(strm); + state->reset = 1; /* all done, no errors */ return 0; @@ -142,10 +140,7 @@ local int gz_comp(state, flush) /* Compress len zeros to output. Return -1 on a write error or memory allocation failure by gz_comp(), or 0 on success. */ -local int gz_zero(state, len) - gz_statep state; - z_off64_t len; -{ +local int gz_zero(gz_statep state, z_off64_t len) { int first; unsigned n; z_streamp strm = &(state->strm); @@ -175,11 +170,7 @@ local int gz_zero(state, len) /* Write len bytes from buf to file. Return the number of bytes written. If the returned value is less than len, then there was an error. */ -local z_size_t gz_write(state, buf, len) - gz_statep state; - voidpc buf; - z_size_t len; -{ +local z_size_t gz_write(gz_statep state, voidpc buf, z_size_t len) { z_size_t put = len; /* if len is zero, avoid unnecessary operations */ @@ -209,7 +200,7 @@ local z_size_t gz_write(state, buf, len) state->in); copy = state->size - have; if (copy > len) - copy = len; + copy = (unsigned)len; memcpy(state->in + have, buf, copy); state->strm.avail_in += copy; state->x.pos += copy; @@ -229,7 +220,7 @@ local z_size_t gz_write(state, buf, len) do { unsigned n = (unsigned)-1; if (n > len) - n = len; + n = (unsigned)len; state->strm.avail_in = n; state->x.pos += n; if (gz_comp(state, Z_NO_FLUSH) == -1) @@ -243,11 +234,7 @@ local z_size_t gz_write(state, buf, len) } /* -- see zlib.h -- */ -int ZEXPORT gzwrite(file, buf, len) - gzFile file; - voidpc buf; - unsigned len; -{ +int ZEXPORT gzwrite(gzFile file, voidpc buf, unsigned len) { gz_statep state; /* get internal structure */ @@ -271,12 +258,8 @@ int ZEXPORT gzwrite(file, buf, len) } /* -- see zlib.h -- */ -z_size_t ZEXPORT gzfwrite(buf, size, nitems, file) - voidpc buf; - z_size_t size; - z_size_t nitems; - gzFile file; -{ +z_size_t ZEXPORT gzfwrite(voidpc buf, z_size_t size, z_size_t nitems, + gzFile file) { z_size_t len; gz_statep state; @@ -301,10 +284,7 @@ z_size_t ZEXPORT gzfwrite(buf, size, nitems, file) } /* -- see zlib.h -- */ -int ZEXPORT gzputc(file, c) - gzFile file; - int c; -{ +int ZEXPORT gzputc(gzFile file, int c) { unsigned have; unsigned char buf[1]; gz_statep state; @@ -349,12 +329,8 @@ int ZEXPORT gzputc(file, c) } /* -- see zlib.h -- */ -int ZEXPORT gzputs(file, str) - gzFile file; - const char *str; -{ - int ret; - z_size_t len; +int ZEXPORT gzputs(gzFile file, const char *s) { + z_size_t len, put; gz_statep state; /* get internal structure */ @@ -367,17 +343,20 @@ int ZEXPORT gzputs(file, str) return -1; /* write string */ - len = strlen(str); - ret = gz_write(state, str, len); - return ret == 0 && len != 0 ? -1 : ret; + len = strlen(s); + if ((int)len < 0 || (unsigned)len != len) { + gz_error(state, Z_STREAM_ERROR, "string length does not fit in int"); + return -1; + } + put = gz_write(state, s, len); + return put < len ? -1 : (int)len; } #if defined(STDC) || defined(Z_HAVE_STDARG_H) #include /* -- see zlib.h -- */ -int ZEXPORTVA gzvprintf(gzFile file, const char *format, va_list va) -{ +int ZEXPORTVA gzvprintf(gzFile file, const char *format, va_list va) { int len; unsigned left; char *next; @@ -441,15 +420,14 @@ int ZEXPORTVA gzvprintf(gzFile file, const char *format, va_list va) strm->avail_in = state->size; if (gz_comp(state, Z_NO_FLUSH) == -1) return state->err; - memcpy(state->in, state->in + state->size, left); + memmove(state->in, state->in + state->size, left); strm->next_in = state->in; strm->avail_in = left; } return len; } -int ZEXPORTVA gzprintf(gzFile file, const char *format, ...) -{ +int ZEXPORTVA gzprintf(gzFile file, const char *format, ...) { va_list va; int ret; @@ -462,13 +440,10 @@ int ZEXPORTVA gzprintf(gzFile file, const char *format, ...) #else /* !STDC && !Z_HAVE_STDARG_H */ /* -- see zlib.h -- */ -int ZEXPORTVA gzprintf (file, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, - a11, a12, a13, a14, a15, a16, a17, a18, a19, a20) - gzFile file; - const char *format; - int a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, - a11, a12, a13, a14, a15, a16, a17, a18, a19, a20; -{ +int ZEXPORTVA gzprintf(gzFile file, const char *format, int a1, int a2, int a3, + int a4, int a5, int a6, int a7, int a8, int a9, int a10, + int a11, int a12, int a13, int a14, int a15, int a16, + int a17, int a18, int a19, int a20) { unsigned len, left; char *next; gz_statep state; @@ -540,7 +515,7 @@ int ZEXPORTVA gzprintf (file, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, strm->avail_in = state->size; if (gz_comp(state, Z_NO_FLUSH) == -1) return state->err; - memcpy(state->in, state->in + state->size, left); + memmove(state->in, state->in + state->size, left); strm->next_in = state->in; strm->avail_in = left; } @@ -550,10 +525,7 @@ int ZEXPORTVA gzprintf (file, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, #endif /* -- see zlib.h -- */ -int ZEXPORT gzflush(file, flush) - gzFile file; - int flush; -{ +int ZEXPORT gzflush(gzFile file, int flush) { gz_statep state; /* get internal structure */ @@ -582,11 +554,7 @@ int ZEXPORT gzflush(file, flush) } /* -- see zlib.h -- */ -int ZEXPORT gzsetparams(file, level, strategy) - gzFile file; - int level; - int strategy; -{ +int ZEXPORT gzsetparams(gzFile file, int level, int strategy) { gz_statep state; z_streamp strm; @@ -597,7 +565,7 @@ int ZEXPORT gzsetparams(file, level, strategy) strm = &(state->strm); /* check that we're writing and that there's no error */ - if (state->mode != GZ_WRITE || state->err != Z_OK) + if (state->mode != GZ_WRITE || state->err != Z_OK || state->direct) return Z_STREAM_ERROR; /* if no change is requested, then do nothing */ @@ -624,9 +592,7 @@ int ZEXPORT gzsetparams(file, level, strategy) } /* -- see zlib.h -- */ -int ZEXPORT gzclose_w(file) - gzFile file; -{ +int ZEXPORT gzclose_w(gzFile file) { int ret = Z_OK; gz_statep state; diff --git a/zlib/infback.c b/zlib/infback.c index 59679ecbfc5d..e7b25b307a30 100644 --- a/zlib/infback.c +++ b/zlib/infback.c @@ -1,5 +1,5 @@ /* infback.c -- inflate using a call-back interface - * Copyright (C) 1995-2016 Mark Adler + * Copyright (C) 1995-2022 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -15,9 +15,6 @@ #include "inflate.h" #include "inffast.h" -/* function prototypes */ -local void fixedtables OF((struct inflate_state FAR *state)); - /* strm provides memory allocation functions in zalloc and zfree, or Z_NULL to use the library memory allocation functions. @@ -25,13 +22,9 @@ local void fixedtables OF((struct inflate_state FAR *state)); windowBits is in the range 8..15, and window is a user-supplied window and output buffer that is 2**windowBits bytes. */ -int ZEXPORT inflateBackInit_(strm, windowBits, window, version, stream_size) -z_streamp strm; -int windowBits; -unsigned char FAR *window; -const char *version; -int stream_size; -{ +int ZEXPORT inflateBackInit_(z_streamp strm, int windowBits, + unsigned char FAR *window, const char *version, + int stream_size) { struct inflate_state FAR *state; if (version == Z_NULL || version[0] != ZLIB_VERSION[0] || @@ -66,6 +59,7 @@ int stream_size; state->window = window; state->wnext = 0; state->whave = 0; + state->sane = 1; return Z_OK; } @@ -79,9 +73,7 @@ int stream_size; used for threaded applications, since the rewriting of the tables and virgin may not be thread-safe. */ -local void fixedtables(state) -struct inflate_state FAR *state; -{ +local void fixedtables(struct inflate_state FAR *state) { #ifdef BUILDFIXED static int virgin = 1; static code *lenfix, *distfix; @@ -247,13 +239,8 @@ struct inflate_state FAR *state; inflateBack() can also return Z_STREAM_ERROR if the input parameters are not correct, i.e. strm is Z_NULL or the state was not initialized. */ -int ZEXPORT inflateBack(strm, in, in_desc, out, out_desc) -z_streamp strm; -in_func in; -void FAR *in_desc; -out_func out; -void FAR *out_desc; -{ +int ZEXPORT inflateBack(z_streamp strm, in_func in, void FAR *in_desc, + out_func out, void FAR *out_desc) { struct inflate_state FAR *state; z_const unsigned char FAR *next; /* next input */ unsigned char FAR *put; /* next output */ @@ -477,6 +464,7 @@ void FAR *out_desc; } Tracev((stderr, "inflate: codes ok\n")); state->mode = LEN; + /* fallthrough */ case LEN: /* use inflate_fast() if we have enough input and output */ @@ -604,33 +592,33 @@ void FAR *out_desc; break; case DONE: - /* inflate stream terminated properly -- write leftover output */ + /* inflate stream terminated properly */ ret = Z_STREAM_END; - if (left < state->wsize) { - if (out(out_desc, state->window, state->wsize - left)) - ret = Z_BUF_ERROR; - } goto inf_leave; case BAD: ret = Z_DATA_ERROR; goto inf_leave; - default: /* can't happen, but makes compilers happy */ + default: + /* can't happen, but makes compilers happy */ ret = Z_STREAM_ERROR; goto inf_leave; } - /* Return unused input */ + /* Write leftover output and return unused input */ inf_leave: + if (left < state->wsize) { + if (out(out_desc, state->window, state->wsize - left) && + ret == Z_STREAM_END) + ret = Z_BUF_ERROR; + } strm->next_in = next; strm->avail_in = have; return ret; } -int ZEXPORT inflateBackEnd(strm) -z_streamp strm; -{ +int ZEXPORT inflateBackEnd(z_streamp strm) { if (strm == Z_NULL || strm->state == Z_NULL || strm->zfree == (free_func)0) return Z_STREAM_ERROR; ZFREE(strm, strm->state); diff --git a/zlib/inffast.c b/zlib/inffast.c index 0dbd1dbc09f2..9354676e786e 100644 --- a/zlib/inffast.c +++ b/zlib/inffast.c @@ -47,10 +47,7 @@ requires strm->avail_out >= 258 for each loop to avoid checking for output space. */ -void ZLIB_INTERNAL inflate_fast(strm, start) -z_streamp strm; -unsigned start; /* inflate()'s starting value for strm->avail_out */ -{ +void ZLIB_INTERNAL inflate_fast(z_streamp strm, unsigned start) { struct inflate_state FAR *state; z_const unsigned char FAR *in; /* local strm->next_in */ z_const unsigned char FAR *last; /* have enough input while in < last */ @@ -70,7 +67,7 @@ unsigned start; /* inflate()'s starting value for strm->avail_out */ code const FAR *dcode; /* local strm->distcode */ unsigned lmask; /* mask for first level of length codes */ unsigned dmask; /* mask for first level of distance codes */ - code here; /* retrieved table entry */ + code const *here; /* retrieved table entry */ unsigned op; /* code bits, operation, extra bits, or */ /* window position, window bytes to copy */ unsigned len; /* match length, unused bytes */ @@ -107,20 +104,20 @@ unsigned start; /* inflate()'s starting value for strm->avail_out */ hold += (unsigned long)(*in++) << bits; bits += 8; } - here = lcode[hold & lmask]; + here = lcode + (hold & lmask); dolen: - op = (unsigned)(here.bits); + op = (unsigned)(here->bits); hold >>= op; bits -= op; - op = (unsigned)(here.op); + op = (unsigned)(here->op); if (op == 0) { /* literal */ - Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ? + Tracevv((stderr, here->val >= 0x20 && here->val < 0x7f ? "inflate: literal '%c'\n" : - "inflate: literal 0x%02x\n", here.val)); - *out++ = (unsigned char)(here.val); + "inflate: literal 0x%02x\n", here->val)); + *out++ = (unsigned char)(here->val); } else if (op & 16) { /* length base */ - len = (unsigned)(here.val); + len = (unsigned)(here->val); op &= 15; /* number of extra bits */ if (op) { if (bits < op) { @@ -138,14 +135,14 @@ unsigned start; /* inflate()'s starting value for strm->avail_out */ hold += (unsigned long)(*in++) << bits; bits += 8; } - here = dcode[hold & dmask]; + here = dcode + (hold & dmask); dodist: - op = (unsigned)(here.bits); + op = (unsigned)(here->bits); hold >>= op; bits -= op; - op = (unsigned)(here.op); + op = (unsigned)(here->op); if (op & 16) { /* distance base */ - dist = (unsigned)(here.val); + dist = (unsigned)(here->val); op &= 15; /* number of extra bits */ if (bits < op) { hold += (unsigned long)(*in++) << bits; @@ -264,7 +261,7 @@ unsigned start; /* inflate()'s starting value for strm->avail_out */ } } else if ((op & 64) == 0) { /* 2nd level distance code */ - here = dcode[here.val + (hold & ((1U << op) - 1))]; + here = dcode + here->val + (hold & ((1U << op) - 1)); goto dodist; } else { @@ -274,7 +271,7 @@ unsigned start; /* inflate()'s starting value for strm->avail_out */ } } else if ((op & 64) == 0) { /* 2nd level length code */ - here = lcode[here.val + (hold & ((1U << op) - 1))]; + here = lcode + here->val + (hold & ((1U << op) - 1)); goto dolen; } else if (op & 32) { /* end-of-block */ diff --git a/zlib/inffast.h b/zlib/inffast.h index e5c1aa4ca8cd..49c6d156c5c6 100644 --- a/zlib/inffast.h +++ b/zlib/inffast.h @@ -8,4 +8,4 @@ subject to change. Applications should only use zlib.h. */ -void ZLIB_INTERNAL inflate_fast OF((z_streamp strm, unsigned start)); +void ZLIB_INTERNAL inflate_fast(z_streamp strm, unsigned start); diff --git a/zlib/inflate.c b/zlib/inflate.c index ac333e8c2eda..94ecff015a9b 100644 --- a/zlib/inflate.c +++ b/zlib/inflate.c @@ -1,5 +1,5 @@ /* inflate.c -- zlib decompression - * Copyright (C) 1995-2016 Mark Adler + * Copyright (C) 1995-2022 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -91,20 +91,7 @@ # endif #endif -/* function prototypes */ -local int inflateStateCheck OF((z_streamp strm)); -local void fixedtables OF((struct inflate_state FAR *state)); -local int updatewindow OF((z_streamp strm, const unsigned char FAR *end, - unsigned copy)); -#ifdef BUILDFIXED - void makefixed OF((void)); -#endif -local unsigned syncsearch OF((unsigned FAR *have, const unsigned char FAR *buf, - unsigned len)); - -local int inflateStateCheck(strm) -z_streamp strm; -{ +local int inflateStateCheck(z_streamp strm) { struct inflate_state FAR *state; if (strm == Z_NULL || strm->zalloc == (alloc_func)0 || strm->zfree == (free_func)0) @@ -116,9 +103,7 @@ z_streamp strm; return 0; } -int ZEXPORT inflateResetKeep(strm) -z_streamp strm; -{ +int ZEXPORT inflateResetKeep(z_streamp strm) { struct inflate_state FAR *state; if (inflateStateCheck(strm)) return Z_STREAM_ERROR; @@ -130,6 +115,7 @@ z_streamp strm; state->mode = HEAD; state->last = 0; state->havedict = 0; + state->flags = -1; state->dmax = 32768U; state->head = Z_NULL; state->hold = 0; @@ -141,9 +127,7 @@ z_streamp strm; return Z_OK; } -int ZEXPORT inflateReset(strm) -z_streamp strm; -{ +int ZEXPORT inflateReset(z_streamp strm) { struct inflate_state FAR *state; if (inflateStateCheck(strm)) return Z_STREAM_ERROR; @@ -154,10 +138,7 @@ z_streamp strm; return inflateResetKeep(strm); } -int ZEXPORT inflateReset2(strm, windowBits) -z_streamp strm; -int windowBits; -{ +int ZEXPORT inflateReset2(z_streamp strm, int windowBits) { int wrap; struct inflate_state FAR *state; @@ -167,6 +148,8 @@ int windowBits; /* extract wrap request from windowBits parameter */ if (windowBits < 0) { + if (windowBits < -15) + return Z_STREAM_ERROR; wrap = 0; windowBits = -windowBits; } @@ -192,12 +175,8 @@ int windowBits; return inflateReset(strm); } -int ZEXPORT inflateInit2_(strm, windowBits, version, stream_size) -z_streamp strm; -int windowBits; -const char *version; -int stream_size; -{ +int ZEXPORT inflateInit2_(z_streamp strm, int windowBits, + const char *version, int stream_size) { int ret; struct inflate_state FAR *state; @@ -236,22 +215,17 @@ int stream_size; return ret; } -int ZEXPORT inflateInit_(strm, version, stream_size) -z_streamp strm; -const char *version; -int stream_size; -{ +int ZEXPORT inflateInit_(z_streamp strm, const char *version, + int stream_size) { return inflateInit2_(strm, DEF_WBITS, version, stream_size); } -int ZEXPORT inflatePrime(strm, bits, value) -z_streamp strm; -int bits; -int value; -{ +int ZEXPORT inflatePrime(z_streamp strm, int bits, int value) { struct inflate_state FAR *state; if (inflateStateCheck(strm)) return Z_STREAM_ERROR; + if (bits == 0) + return Z_OK; state = (struct inflate_state FAR *)strm->state; if (bits < 0) { state->hold = 0; @@ -275,9 +249,7 @@ int value; used for threaded applications, since the rewriting of the tables and virgin may not be thread-safe. */ -local void fixedtables(state) -struct inflate_state FAR *state; -{ +local void fixedtables(struct inflate_state FAR *state) { #ifdef BUILDFIXED static int virgin = 1; static code *lenfix, *distfix; @@ -339,7 +311,7 @@ struct inflate_state FAR *state; a.out > inffixed.h */ -void makefixed() +void makefixed(void) { unsigned low, size; struct inflate_state state; @@ -393,11 +365,7 @@ void makefixed() output will fall in the output data, making match copies simpler and faster. The advantage may be dependent on the size of the processor's data caches. */ -local int updatewindow(strm, end, copy) -z_streamp strm; -const Bytef *end; -unsigned copy; -{ +local int updatewindow(z_streamp strm, const Bytef *end, unsigned copy) { struct inflate_state FAR *state; unsigned dist; @@ -447,10 +415,10 @@ unsigned copy; /* check function to use adler32() for zlib or crc32() for gzip */ #ifdef GUNZIP -# define UPDATE(check, buf, len) \ +# define UPDATE_CHECK(check, buf, len) \ (state->flags ? crc32(check, buf, len) : adler32(check, buf, len)) #else -# define UPDATE(check, buf, len) adler32(check, buf, len) +# define UPDATE_CHECK(check, buf, len) adler32(check, buf, len) #endif /* check macros for header crc */ @@ -619,10 +587,7 @@ unsigned copy; will return Z_BUF_ERROR if it has not reached the end of the stream. */ -int ZEXPORT inflate(strm, flush) -z_streamp strm; -int flush; -{ +int ZEXPORT inflate(z_streamp strm, int flush) { struct inflate_state FAR *state; z_const unsigned char FAR *next; /* next input */ unsigned char FAR *put; /* next output */ @@ -670,7 +635,6 @@ int flush; state->mode = FLAGS; break; } - state->flags = 0; /* expect zlib header */ if (state->head != Z_NULL) state->head->done = -1; if (!(state->wrap & 1) || /* check if zlib header allowed */ @@ -697,6 +661,7 @@ int flush; break; } state->dmax = 1U << len; + state->flags = 0; /* indicate zlib header */ Tracev((stderr, "inflate: zlib header ok\n")); strm->adler = state->check = adler32(0L, Z_NULL, 0); state->mode = hold & 0x200 ? DICTID : TYPE; @@ -722,6 +687,7 @@ int flush; CRC2(state->check, hold); INITBITS(); state->mode = TIME; + /* fallthrough */ case TIME: NEEDBITS(32); if (state->head != Z_NULL) @@ -730,6 +696,7 @@ int flush; CRC4(state->check, hold); INITBITS(); state->mode = OS; + /* fallthrough */ case OS: NEEDBITS(16); if (state->head != Z_NULL) { @@ -740,6 +707,7 @@ int flush; CRC2(state->check, hold); INITBITS(); state->mode = EXLEN; + /* fallthrough */ case EXLEN: if (state->flags & 0x0400) { NEEDBITS(16); @@ -753,14 +721,16 @@ int flush; else if (state->head != Z_NULL) state->head->extra = Z_NULL; state->mode = EXTRA; + /* fallthrough */ case EXTRA: if (state->flags & 0x0400) { copy = state->length; if (copy > have) copy = have; if (copy) { if (state->head != Z_NULL && - state->head->extra != Z_NULL) { - len = state->head->extra_len - state->length; + state->head->extra != Z_NULL && + (len = state->head->extra_len - state->length) < + state->head->extra_max) { zmemcpy(state->head->extra + len, next, len + copy > state->head->extra_max ? state->head->extra_max - len : copy); @@ -775,6 +745,7 @@ int flush; } state->length = 0; state->mode = NAME; + /* fallthrough */ case NAME: if (state->flags & 0x0800) { if (have == 0) goto inf_leave; @@ -796,6 +767,7 @@ int flush; state->head->name = Z_NULL; state->length = 0; state->mode = COMMENT; + /* fallthrough */ case COMMENT: if (state->flags & 0x1000) { if (have == 0) goto inf_leave; @@ -816,6 +788,7 @@ int flush; else if (state->head != Z_NULL) state->head->comment = Z_NULL; state->mode = HCRC; + /* fallthrough */ case HCRC: if (state->flags & 0x0200) { NEEDBITS(16); @@ -839,6 +812,7 @@ int flush; strm->adler = state->check = ZSWAP32(hold); INITBITS(); state->mode = DICT; + /* fallthrough */ case DICT: if (state->havedict == 0) { RESTORE(); @@ -846,8 +820,10 @@ int flush; } strm->adler = state->check = adler32(0L, Z_NULL, 0); state->mode = TYPE; + /* fallthrough */ case TYPE: if (flush == Z_BLOCK || flush == Z_TREES) goto inf_leave; + /* fallthrough */ case TYPEDO: if (state->last) { BYTEBITS(); @@ -898,8 +874,10 @@ int flush; INITBITS(); state->mode = COPY_; if (flush == Z_TREES) goto inf_leave; + /* fallthrough */ case COPY_: state->mode = COPY; + /* fallthrough */ case COPY: copy = state->length; if (copy) { @@ -935,6 +913,7 @@ int flush; Tracev((stderr, "inflate: table sizes ok\n")); state->have = 0; state->mode = LENLENS; + /* fallthrough */ case LENLENS: while (state->have < state->ncode) { NEEDBITS(3); @@ -956,6 +935,7 @@ int flush; Tracev((stderr, "inflate: code lengths ok\n")); state->have = 0; state->mode = CODELENS; + /* fallthrough */ case CODELENS: while (state->have < state->nlen + state->ndist) { for (;;) { @@ -1039,8 +1019,10 @@ int flush; Tracev((stderr, "inflate: codes ok\n")); state->mode = LEN_; if (flush == Z_TREES) goto inf_leave; + /* fallthrough */ case LEN_: state->mode = LEN; + /* fallthrough */ case LEN: if (have >= 6 && left >= 258) { RESTORE(); @@ -1090,6 +1072,7 @@ int flush; } state->extra = (unsigned)(here.op) & 15; state->mode = LENEXT; + /* fallthrough */ case LENEXT: if (state->extra) { NEEDBITS(state->extra); @@ -1100,6 +1083,7 @@ int flush; Tracevv((stderr, "inflate: length %u\n", state->length)); state->was = state->length; state->mode = DIST; + /* fallthrough */ case DIST: for (;;) { here = state->distcode[BITS(state->distbits)]; @@ -1127,6 +1111,7 @@ int flush; state->offset = (unsigned)here.val; state->extra = (unsigned)(here.op) & 15; state->mode = DISTEXT; + /* fallthrough */ case DISTEXT: if (state->extra) { NEEDBITS(state->extra); @@ -1143,6 +1128,7 @@ int flush; #endif Tracevv((stderr, "inflate: distance %u\n", state->offset)); state->mode = MATCH; + /* fallthrough */ case MATCH: if (left == 0) goto inf_leave; copy = out - left; @@ -1202,7 +1188,7 @@ int flush; state->total += out; if ((state->wrap & 4) && out) strm->adler = state->check = - UPDATE(state->check, put - out, out); + UPDATE_CHECK(state->check, put - out, out); out = left; if ((state->wrap & 4) && ( #ifdef GUNZIP @@ -1218,10 +1204,11 @@ int flush; } #ifdef GUNZIP state->mode = LENGTH; + /* fallthrough */ case LENGTH: if (state->wrap && state->flags) { NEEDBITS(32); - if (hold != (state->total & 0xffffffffUL)) { + if ((state->wrap & 4) && hold != (state->total & 0xffffffff)) { strm->msg = (char *)"incorrect length check"; state->mode = BAD; break; @@ -1231,6 +1218,7 @@ int flush; } #endif state->mode = DONE; + /* fallthrough */ case DONE: ret = Z_STREAM_END; goto inf_leave; @@ -1240,6 +1228,7 @@ int flush; case MEM: return Z_MEM_ERROR; case SYNC: + /* fallthrough */ default: return Z_STREAM_ERROR; } @@ -1265,7 +1254,7 @@ int flush; state->total += out; if ((state->wrap & 4) && out) strm->adler = state->check = - UPDATE(state->check, strm->next_out - out, out); + UPDATE_CHECK(state->check, strm->next_out - out, out); strm->data_type = (int)state->bits + (state->last ? 64 : 0) + (state->mode == TYPE ? 128 : 0) + (state->mode == LEN_ || state->mode == COPY_ ? 256 : 0); @@ -1274,9 +1263,7 @@ int flush; return ret; } -int ZEXPORT inflateEnd(strm) -z_streamp strm; -{ +int ZEXPORT inflateEnd(z_streamp strm) { struct inflate_state FAR *state; if (inflateStateCheck(strm)) return Z_STREAM_ERROR; @@ -1288,11 +1275,8 @@ z_streamp strm; return Z_OK; } -int ZEXPORT inflateGetDictionary(strm, dictionary, dictLength) -z_streamp strm; -Bytef *dictionary; -uInt *dictLength; -{ +int ZEXPORT inflateGetDictionary(z_streamp strm, Bytef *dictionary, + uInt *dictLength) { struct inflate_state FAR *state; /* check state */ @@ -1311,11 +1295,8 @@ uInt *dictLength; return Z_OK; } -int ZEXPORT inflateSetDictionary(strm, dictionary, dictLength) -z_streamp strm; -const Bytef *dictionary; -uInt dictLength; -{ +int ZEXPORT inflateSetDictionary(z_streamp strm, const Bytef *dictionary, + uInt dictLength) { struct inflate_state FAR *state; unsigned long dictid; int ret; @@ -1346,10 +1327,7 @@ uInt dictLength; return Z_OK; } -int ZEXPORT inflateGetHeader(strm, head) -z_streamp strm; -gz_headerp head; -{ +int ZEXPORT inflateGetHeader(z_streamp strm, gz_headerp head) { struct inflate_state FAR *state; /* check state */ @@ -1374,11 +1352,8 @@ gz_headerp head; called again with more data and the *have state. *have is initialized to zero for the first call. */ -local unsigned syncsearch(have, buf, len) -unsigned FAR *have; -const unsigned char FAR *buf; -unsigned len; -{ +local unsigned syncsearch(unsigned FAR *have, const unsigned char FAR *buf, + unsigned len) { unsigned got; unsigned next; @@ -1397,10 +1372,9 @@ unsigned len; return next; } -int ZEXPORT inflateSync(strm) -z_streamp strm; -{ +int ZEXPORT inflateSync(z_streamp strm) { unsigned len; /* number of bytes to look at or looked at */ + int flags; /* temporary to save header status */ unsigned long in, out; /* temporary to save total_in and total_out */ unsigned char buf[4]; /* to restore bit buffer to byte string */ struct inflate_state FAR *state; @@ -1413,7 +1387,7 @@ z_streamp strm; /* if first time, start search in bit buffer */ if (state->mode != SYNC) { state->mode = SYNC; - state->hold <<= state->bits & 7; + state->hold >>= state->bits & 7; state->bits -= state->bits & 7; len = 0; while (state->bits >= 8) { @@ -1433,9 +1407,15 @@ z_streamp strm; /* return no joy or set up to restart inflate() on a new block */ if (state->have != 4) return Z_DATA_ERROR; + if (state->flags == -1) + state->wrap = 0; /* if no header yet, treat as raw */ + else + state->wrap &= ~4; /* no point in computing a check value now */ + flags = state->flags; in = strm->total_in; out = strm->total_out; inflateReset(strm); strm->total_in = in; strm->total_out = out; + state->flags = flags; state->mode = TYPE; return Z_OK; } @@ -1448,9 +1428,7 @@ z_streamp strm; block. When decompressing, PPP checks that at the end of input packet, inflate is waiting for these length bytes. */ -int ZEXPORT inflateSyncPoint(strm) -z_streamp strm; -{ +int ZEXPORT inflateSyncPoint(z_streamp strm) { struct inflate_state FAR *state; if (inflateStateCheck(strm)) return Z_STREAM_ERROR; @@ -1458,10 +1436,7 @@ z_streamp strm; return state->mode == STORED && state->bits == 0; } -int ZEXPORT inflateCopy(dest, source) -z_streamp dest; -z_streamp source; -{ +int ZEXPORT inflateCopy(z_streamp dest, z_streamp source) { struct inflate_state FAR *state; struct inflate_state FAR *copy; unsigned char FAR *window; @@ -1505,10 +1480,7 @@ z_streamp source; return Z_OK; } -int ZEXPORT inflateUndermine(strm, subvert) -z_streamp strm; -int subvert; -{ +int ZEXPORT inflateUndermine(z_streamp strm, int subvert) { struct inflate_state FAR *state; if (inflateStateCheck(strm)) return Z_STREAM_ERROR; @@ -1523,24 +1495,19 @@ int subvert; #endif } -int ZEXPORT inflateValidate(strm, check) -z_streamp strm; -int check; -{ +int ZEXPORT inflateValidate(z_streamp strm, int check) { struct inflate_state FAR *state; if (inflateStateCheck(strm)) return Z_STREAM_ERROR; state = (struct inflate_state FAR *)strm->state; - if (check) + if (check && state->wrap) state->wrap |= 4; else state->wrap &= ~4; return Z_OK; } -long ZEXPORT inflateMark(strm) -z_streamp strm; -{ +long ZEXPORT inflateMark(z_streamp strm) { struct inflate_state FAR *state; if (inflateStateCheck(strm)) @@ -1551,9 +1518,7 @@ z_streamp strm; (state->mode == MATCH ? state->was - state->length : 0)); } -unsigned long ZEXPORT inflateCodesUsed(strm) -z_streamp strm; -{ +unsigned long ZEXPORT inflateCodesUsed(z_streamp strm) { struct inflate_state FAR *state; if (inflateStateCheck(strm)) return (unsigned long)-1; state = (struct inflate_state FAR *)strm->state; diff --git a/zlib/inflate.h b/zlib/inflate.h index a46cce6b6d05..f127b6b1fa5f 100644 --- a/zlib/inflate.h +++ b/zlib/inflate.h @@ -1,5 +1,5 @@ /* inflate.h -- internal inflate state definition - * Copyright (C) 1995-2016 Mark Adler + * Copyright (C) 1995-2019 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -86,7 +86,8 @@ struct inflate_state { int wrap; /* bit 0 true for zlib, bit 1 true for gzip, bit 2 true to validate check value */ int havedict; /* true if dictionary provided */ - int flags; /* gzip header method and flags (0 if zlib) */ + int flags; /* gzip header method and flags, 0 if zlib, or + -1 if raw or no header yet */ unsigned dmax; /* zlib header max distance (INFLATE_STRICT) */ unsigned long check; /* protected copy of check value */ unsigned long total; /* protected copy of output count */ diff --git a/zlib/inftrees.c b/zlib/inftrees.c index 2ea08fc13ea8..98cfe164458c 100644 --- a/zlib/inftrees.c +++ b/zlib/inftrees.c @@ -1,5 +1,5 @@ /* inftrees.c -- generate Huffman trees for efficient decoding - * Copyright (C) 1995-2017 Mark Adler + * Copyright (C) 1995-2024 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -9,7 +9,7 @@ #define MAXBITS 15 const char inflate_copyright[] = - " inflate 1.2.11 Copyright 1995-2017 Mark Adler "; + " inflate 1.3.1 Copyright 1995-2024 Mark Adler "; /* If you use the zlib library in a product, an acknowledgment is welcome in the documentation of your product. If for some reason you cannot @@ -29,14 +29,9 @@ const char inflate_copyright[] = table index bits. It will differ if the request is greater than the longest code or if it is less than the shortest code. */ -int ZLIB_INTERNAL inflate_table(type, lens, codes, table, bits, work) -codetype type; -unsigned short FAR *lens; -unsigned codes; -code FAR * FAR *table; -unsigned FAR *bits; -unsigned short FAR *work; -{ +int ZLIB_INTERNAL inflate_table(codetype type, unsigned short FAR *lens, + unsigned codes, code FAR * FAR *table, + unsigned FAR *bits, unsigned short FAR *work) { unsigned len; /* a code's length in bits */ unsigned sym; /* index of code symbols */ unsigned min, max; /* minimum and maximum code lengths */ @@ -62,7 +57,7 @@ unsigned short FAR *work; 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0}; static const unsigned short lext[31] = { /* Length codes 257..285 extra */ 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, - 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 77, 202}; + 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 203, 77}; static const unsigned short dbase[32] = { /* Distance codes 0..29 base */ 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, diff --git a/zlib/inftrees.h b/zlib/inftrees.h index baa53a0b1a19..396f74b5da79 100644 --- a/zlib/inftrees.h +++ b/zlib/inftrees.h @@ -38,11 +38,11 @@ typedef struct { /* Maximum size of the dynamic table. The maximum number of code structures is 1444, which is the sum of 852 for literal/length codes and 592 for distance codes. These values were found by exhaustive searches using the program - examples/enough.c found in the zlib distribtution. The arguments to that + examples/enough.c found in the zlib distribution. The arguments to that program are the number of symbols, the initial root table size, and the maximum bit length of a code. "enough 286 9 15" for literal/length codes - returns returns 852, and "enough 30 6 15" for distance codes returns 592. - The initial root table size (9 or 6) is found in the fifth argument of the + returns 852, and "enough 30 6 15" for distance codes returns 592. The + initial root table size (9 or 6) is found in the fifth argument of the inflate_table() calls in inflate.c and infback.c. If the root table size is changed, then these maximum sizes would be need to be recalculated and updated. */ @@ -57,6 +57,6 @@ typedef enum { DISTS } codetype; -int ZLIB_INTERNAL inflate_table OF((codetype type, unsigned short FAR *lens, - unsigned codes, code FAR * FAR *table, - unsigned FAR *bits, unsigned short FAR *work)); +int ZLIB_INTERNAL inflate_table(codetype type, unsigned short FAR *lens, + unsigned codes, code FAR * FAR *table, + unsigned FAR *bits, unsigned short FAR *work); diff --git a/zlib/make_vms.com b/zlib/make_vms.com index 65e9d0cbc8e1..4dc8a8913559 100644 --- a/zlib/make_vms.com +++ b/zlib/make_vms.com @@ -14,9 +14,9 @@ $! 0.02 20061008 Adapt to new Makefile.in $! 0.03 20091224 Add support for large file check $! 0.04 20100110 Add new gzclose, gzlib, gzread, gzwrite $! 0.05 20100221 Exchange zlibdefs.h by zconf.h.in -$! 0.06 20120111 Fix missing amiss_err, update zconf_h.in, fix new exmples +$! 0.06 20120111 Fix missing amiss_err, update zconf_h.in, fix new examples $! subdir path, update module search in makefile.in -$! 0.07 20120115 Triggered by work done by Alexey Chupahin completly redesigned +$! 0.07 20120115 Triggered by work done by Alexey Chupahin completely redesigned $! shared image creation $! 0.08 20120219 Make it work on VAX again, pre-load missing symbols to shared $! image diff --git a/zlib/old/visual-basic.txt b/zlib/old/visual-basic.txt index 57efe58124ee..3c8d2a42dfca 100644 --- a/zlib/old/visual-basic.txt +++ b/zlib/old/visual-basic.txt @@ -115,7 +115,7 @@ SUCCESS Then ReDim Preserve bytaryCpr(lngCprSiz - 1) Open strCprPth For Binary Access Write As #1 Put #1, , bytaryCpr() - Put #1, , lngOriSiz 'Add the the original size value to the end + Put #1, , lngOriSiz 'Add the original size value to the end (last 4 bytes) Close #1 Else diff --git a/zlib/os400/README400 b/zlib/os400/README400 index 4f98334f5ac5..30ed5a12c686 100644 --- a/zlib/os400/README400 +++ b/zlib/os400/README400 @@ -1,9 +1,9 @@ - ZLIB version 1.2.11 for OS/400 installation instructions + ZLIB version 1.3.1 for OS/400 installation instructions 1) Download and unpack the zlib tarball to some IFS directory. (i.e.: /path/to/the/zlib/ifs/source/directory) - If the installed IFS command suppors gzip format, this is straightforward, + If the installed IFS command supports gzip format, this is straightforward, else you have to unpack first to some directory on a system supporting it, then move the whole directory to the IFS via the network (via SMB or FTP). @@ -43,6 +43,6 @@ Notes: For OS/400 ILE RPG programmers, a /copy member defining the ZLIB Remember that most foreign textual data are ASCII coded: this implementation does not handle conversion from/to ASCII, so - text data code conversions must be done explicitely. + text data code conversions must be done explicitly. Mainly for the reason above, always open zipped files in binary mode. diff --git a/zlib/os400/bndsrc b/zlib/os400/bndsrc index 5e6e0a2f0af3..9f92bb10cf37 100644 --- a/zlib/os400/bndsrc +++ b/zlib/os400/bndsrc @@ -116,4 +116,12 @@ STRPGMEXP PGMLVL(*CURRENT) SIGNATURE('ZLIB') EXPORT SYMBOL("inflateValidate") EXPORT SYMBOL("uncompress2") +/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/ +/* Version 1.2.12 additional entry points. */ +/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/ + + EXPORT SYMBOL("crc32_combine_gen64") + EXPORT SYMBOL("crc32_combine_gen") + EXPORT SYMBOL("crc32_combine_op") + ENDPGMEXP diff --git a/zlib/os400/zlib.inc b/zlib/os400/zlib.inc index c6aca2cbd6ae..744729ab9dd4 100644 --- a/zlib/os400/zlib.inc +++ b/zlib/os400/zlib.inc @@ -1,7 +1,7 @@ * ZLIB.INC - Interface to the general purpose compression library * * ILE RPG400 version by Patrick Monnerat, DATASPHERE. - * Version 1.2.11 + * Version 1.3.1 * * * WARNING: @@ -22,12 +22,12 @@ * * Versioning information. * - D ZLIB_VERSION C '1.2.11' + D ZLIB_VERSION C '1.3.1' D ZLIB_VERNUM C X'12a0' D ZLIB_VER_MAJOR C 1 - D ZLIB_VER_MINOR C 2 + D ZLIB_VER_MINOR C 3 D ZLIB_VER_REVISION... - D C 11 + D C 1 D ZLIB_VER_SUBREVISION... D C 0 * diff --git a/zlib/qnx/package.qpg b/zlib/qnx/package.qpg index 31e8e90db4dc..4877e0ef0133 100644 --- a/zlib/qnx/package.qpg +++ b/zlib/qnx/package.qpg @@ -25,10 +25,10 @@ - - - - + + + + @@ -63,7 +63,7 @@ - 1.2.11 + 1.3.1 Medium Stable diff --git a/zlib/test/example.c b/zlib/test/example.c index eee17ce7c159..c3521dd5934f 100644 --- a/zlib/test/example.c +++ b/zlib/test/example.c @@ -34,37 +34,14 @@ static z_const char hello[] = "hello, hello!"; static const char dictionary[] = "hello"; static uLong dictId; /* Adler32 value of the dictionary */ -void test_deflate OF((Byte *compr, uLong comprLen)); -void test_inflate OF((Byte *compr, uLong comprLen, - Byte *uncompr, uLong uncomprLen)); -void test_large_deflate OF((Byte *compr, uLong comprLen, - Byte *uncompr, uLong uncomprLen)); -void test_large_inflate OF((Byte *compr, uLong comprLen, - Byte *uncompr, uLong uncomprLen)); -void test_flush OF((Byte *compr, uLong *comprLen)); -void test_sync OF((Byte *compr, uLong comprLen, - Byte *uncompr, uLong uncomprLen)); -void test_dict_deflate OF((Byte *compr, uLong comprLen)); -void test_dict_inflate OF((Byte *compr, uLong comprLen, - Byte *uncompr, uLong uncomprLen)); -int main OF((int argc, char *argv[])); - - #ifdef Z_SOLO -void *myalloc OF((void *, unsigned, unsigned)); -void myfree OF((void *, void *)); - -void *myalloc(q, n, m) - void *q; - unsigned n, m; -{ +static void *myalloc(void *q, unsigned n, unsigned m) { (void)q; return calloc(n, m); } -void myfree(void *q, void *p) -{ +static void myfree(void *q, void *p) { (void)q; free(p); } @@ -77,18 +54,11 @@ static free_func zfree = myfree; static alloc_func zalloc = (alloc_func)0; static free_func zfree = (free_func)0; -void test_compress OF((Byte *compr, uLong comprLen, - Byte *uncompr, uLong uncomprLen)); -void test_gzio OF((const char *fname, - Byte *uncompr, uLong uncomprLen)); - /* =========================================================================== * Test compress() and uncompress() */ -void test_compress(compr, comprLen, uncompr, uncomprLen) - Byte *compr, *uncompr; - uLong comprLen, uncomprLen; -{ +static void test_compress(Byte *compr, uLong comprLen, Byte *uncompr, + uLong uncomprLen) { int err; uLong len = (uLong)strlen(hello)+1; @@ -111,11 +81,7 @@ void test_compress(compr, comprLen, uncompr, uncomprLen) /* =========================================================================== * Test read/write of .gz files */ -void test_gzio(fname, uncompr, uncomprLen) - const char *fname; /* compressed file name */ - Byte *uncompr; - uLong uncomprLen; -{ +static void test_gzio(const char *fname, Byte *uncompr, uLong uncomprLen) { #ifdef NO_GZCOMPRESS fprintf(stderr, "NO_GZCOMPRESS -- gz* functions cannot compress\n"); #else @@ -197,10 +163,7 @@ void test_gzio(fname, uncompr, uncomprLen) /* =========================================================================== * Test deflate() with small buffers */ -void test_deflate(compr, comprLen) - Byte *compr; - uLong comprLen; -{ +static void test_deflate(Byte *compr, uLong comprLen) { z_stream c_stream; /* compression stream */ int err; uLong len = (uLong)strlen(hello)+1; @@ -235,10 +198,8 @@ void test_deflate(compr, comprLen) /* =========================================================================== * Test inflate() with small buffers */ -void test_inflate(compr, comprLen, uncompr, uncomprLen) - Byte *compr, *uncompr; - uLong comprLen, uncomprLen; -{ +static void test_inflate(Byte *compr, uLong comprLen, Byte *uncompr, + uLong uncomprLen) { int err; z_stream d_stream; /* decompression stream */ @@ -276,10 +237,8 @@ void test_inflate(compr, comprLen, uncompr, uncomprLen) /* =========================================================================== * Test deflate() with large buffers and dynamic change of compression level */ -void test_large_deflate(compr, comprLen, uncompr, uncomprLen) - Byte *compr, *uncompr; - uLong comprLen, uncomprLen; -{ +static void test_large_deflate(Byte *compr, uLong comprLen, Byte *uncompr, + uLong uncomprLen) { z_stream c_stream; /* compression stream */ int err; @@ -308,7 +267,7 @@ void test_large_deflate(compr, comprLen, uncompr, uncomprLen) /* Feed in already compressed data and switch to no compression: */ deflateParams(&c_stream, Z_NO_COMPRESSION, Z_DEFAULT_STRATEGY); c_stream.next_in = compr; - c_stream.avail_in = (uInt)comprLen/2; + c_stream.avail_in = (uInt)uncomprLen/2; err = deflate(&c_stream, Z_NO_FLUSH); CHECK_ERR(err, "deflate"); @@ -331,10 +290,8 @@ void test_large_deflate(compr, comprLen, uncompr, uncomprLen) /* =========================================================================== * Test inflate() with large buffers */ -void test_large_inflate(compr, comprLen, uncompr, uncomprLen) - Byte *compr, *uncompr; - uLong comprLen, uncomprLen; -{ +static void test_large_inflate(Byte *compr, uLong comprLen, Byte *uncompr, + uLong uncomprLen) { int err; z_stream d_stream; /* decompression stream */ @@ -361,7 +318,7 @@ void test_large_inflate(compr, comprLen, uncompr, uncomprLen) err = inflateEnd(&d_stream); CHECK_ERR(err, "inflateEnd"); - if (d_stream.total_out != 2*uncomprLen + comprLen/2) { + if (d_stream.total_out != 2*uncomprLen + uncomprLen/2) { fprintf(stderr, "bad large inflate: %ld\n", d_stream.total_out); exit(1); } else { @@ -372,10 +329,7 @@ void test_large_inflate(compr, comprLen, uncompr, uncomprLen) /* =========================================================================== * Test deflate() with full flush */ -void test_flush(compr, comprLen) - Byte *compr; - uLong *comprLen; -{ +static void test_flush(Byte *compr, uLong *comprLen) { z_stream c_stream; /* compression stream */ int err; uInt len = (uInt)strlen(hello)+1; @@ -410,10 +364,8 @@ void test_flush(compr, comprLen) /* =========================================================================== * Test inflateSync() */ -void test_sync(compr, comprLen, uncompr, uncomprLen) - Byte *compr, *uncompr; - uLong comprLen, uncomprLen; -{ +static void test_sync(Byte *compr, uLong comprLen, Byte *uncompr, + uLong uncomprLen) { int err; z_stream d_stream; /* decompression stream */ @@ -440,9 +392,8 @@ void test_sync(compr, comprLen, uncompr, uncomprLen) CHECK_ERR(err, "inflateSync"); err = inflate(&d_stream, Z_FINISH); - if (err != Z_DATA_ERROR) { - fprintf(stderr, "inflate should report DATA_ERROR\n"); - /* Because of incorrect adler32 */ + if (err != Z_STREAM_END) { + fprintf(stderr, "inflate should report Z_STREAM_END\n"); exit(1); } err = inflateEnd(&d_stream); @@ -454,10 +405,7 @@ void test_sync(compr, comprLen, uncompr, uncomprLen) /* =========================================================================== * Test deflate() with preset dictionary */ -void test_dict_deflate(compr, comprLen) - Byte *compr; - uLong comprLen; -{ +static void test_dict_deflate(Byte *compr, uLong comprLen) { z_stream c_stream; /* compression stream */ int err; @@ -491,10 +439,8 @@ void test_dict_deflate(compr, comprLen) /* =========================================================================== * Test inflate() with a preset dictionary */ -void test_dict_inflate(compr, comprLen, uncompr, uncomprLen) - Byte *compr, *uncompr; - uLong comprLen, uncomprLen; -{ +static void test_dict_inflate(Byte *compr, uLong comprLen, Byte *uncompr, + uLong uncomprLen) { int err; z_stream d_stream; /* decompression stream */ @@ -542,13 +488,10 @@ void test_dict_inflate(compr, comprLen, uncompr, uncomprLen) * Usage: example [output.gz [input.gz]] */ -int main(argc, argv) - int argc; - char *argv[]; -{ +int main(int argc, char *argv[]) { Byte *compr, *uncompr; - uLong comprLen = 10000*sizeof(int); /* don't overflow on MSDOS */ - uLong uncomprLen = comprLen; + uLong uncomprLen = 20000; + uLong comprLen = 3 * uncomprLen; static const char* myVersion = ZLIB_VERSION; if (zlibVersion()[0] != myVersion[0]) { @@ -556,7 +499,8 @@ int main(argc, argv) exit(1); } else if (strcmp(zlibVersion(), ZLIB_VERSION) != 0) { - fprintf(stderr, "warning: different zlib version\n"); + fprintf(stderr, "warning: different zlib version linked: %s\n", + zlibVersion()); } printf("zlib version %s = 0x%04x, compile flags = 0x%lx\n", @@ -590,7 +534,7 @@ int main(argc, argv) test_flush(compr, &comprLen); test_sync(compr, comprLen, uncompr, uncomprLen); - comprLen = uncomprLen; + comprLen = 3 * uncomprLen; test_dict_deflate(compr, comprLen); test_dict_inflate(compr, comprLen, uncompr, uncomprLen); diff --git a/zlib/test/infcover.c b/zlib/test/infcover.c index 2be01646cec3..8912c403dd2b 100644 --- a/zlib/test/infcover.c +++ b/zlib/test/infcover.c @@ -373,7 +373,7 @@ local void cover_support(void) mem_setup(&strm); strm.avail_in = 0; strm.next_in = Z_NULL; - ret = inflateInit_(&strm, ZLIB_VERSION - 1, (int)sizeof(z_stream)); + ret = inflateInit_(&strm, "!", (int)sizeof(z_stream)); assert(ret == Z_VERSION_ERROR); mem_done(&strm, "wrong version"); @@ -462,7 +462,8 @@ local unsigned pull(void *desc, unsigned char **buf) local int push(void *desc, unsigned char *buf, unsigned len) { - buf += len; + (void)buf; + (void)len; return desc != Z_NULL; /* force error if desc not null */ } diff --git a/zlib/test/minigzip.c b/zlib/test/minigzip.c index e22fb08c0a29..134e10e6c3e9 100644 --- a/zlib/test/minigzip.c +++ b/zlib/test/minigzip.c @@ -59,7 +59,7 @@ #if !defined(Z_HAVE_UNISTD_H) && !defined(_LARGEFILE64_SOURCE) #ifndef WIN32 /* unlink already in stdio.h for WIN32 */ - extern int unlink OF((const char *)); + extern int unlink(const char *); #endif #endif @@ -149,20 +149,12 @@ static void pwinerror (s) # include /* for unlink() */ #endif -void *myalloc OF((void *, unsigned, unsigned)); -void myfree OF((void *, void *)); - -void *myalloc(q, n, m) - void *q; - unsigned n, m; -{ +static void *myalloc(void *q, unsigned n, unsigned m) { (void)q; return calloc(n, m); } -void myfree(q, p) - void *q, *p; -{ +static void myfree(void *q, void *p) { (void)q; free(p); } @@ -175,29 +167,7 @@ typedef struct gzFile_s { z_stream strm; } *gzFile; -gzFile gzopen OF((const char *, const char *)); -gzFile gzdopen OF((int, const char *)); -gzFile gz_open OF((const char *, int, const char *)); - -gzFile gzopen(path, mode) -const char *path; -const char *mode; -{ - return gz_open(path, -1, mode); -} - -gzFile gzdopen(fd, mode) -int fd; -const char *mode; -{ - return gz_open(NULL, fd, mode); -} - -gzFile gz_open(path, fd, mode) - const char *path; - int fd; - const char *mode; -{ +static gzFile gz_open(const char *path, int fd, const char *mode) { gzFile gz; int ret; @@ -231,13 +201,15 @@ gzFile gz_open(path, fd, mode) return gz; } -int gzwrite OF((gzFile, const void *, unsigned)); +static gzFile gzopen(const char *path, const char *mode) { + return gz_open(path, -1, mode); +} -int gzwrite(gz, buf, len) - gzFile gz; - const void *buf; - unsigned len; -{ +static gzFile gzdopen(int fd, const char *mode) { + return gz_open(NULL, fd, mode); +} + +static int gzwrite(gzFile gz, const void *buf, unsigned len) { z_stream *strm; unsigned char out[BUFLEN]; @@ -255,13 +227,7 @@ int gzwrite(gz, buf, len) return len; } -int gzread OF((gzFile, void *, unsigned)); - -int gzread(gz, buf, len) - gzFile gz; - void *buf; - unsigned len; -{ +static int gzread(gzFile gz, void *buf, unsigned len) { int ret; unsigned got; unsigned char in[1]; @@ -292,11 +258,7 @@ int gzread(gz, buf, len) return len - strm->avail_out; } -int gzclose OF((gzFile)); - -int gzclose(gz) - gzFile gz; -{ +static int gzclose(gzFile gz) { z_stream *strm; unsigned char out[BUFLEN]; @@ -321,12 +283,7 @@ int gzclose(gz) return Z_OK; } -const char *gzerror OF((gzFile, int *)); - -const char *gzerror(gz, err) - gzFile gz; - int *err; -{ +static const char *gzerror(gzFile gz, int *err) { *err = gz->err; return gz->msg; } @@ -335,67 +292,20 @@ const char *gzerror(gz, err) static char *prog; -void error OF((const char *msg)); -void gz_compress OF((FILE *in, gzFile out)); -#ifdef USE_MMAP -int gz_compress_mmap OF((FILE *in, gzFile out)); -#endif -void gz_uncompress OF((gzFile in, FILE *out)); -void file_compress OF((char *file, char *mode)); -void file_uncompress OF((char *file)); -int main OF((int argc, char *argv[])); - /* =========================================================================== * Display error message and exit */ -void error(msg) - const char *msg; -{ +static void error(const char *msg) { fprintf(stderr, "%s: %s\n", prog, msg); exit(1); } -/* =========================================================================== - * Compress input to output then close both files. - */ - -void gz_compress(in, out) - FILE *in; - gzFile out; -{ - local char buf[BUFLEN]; - int len; - int err; - -#ifdef USE_MMAP - /* Try first compressing with mmap. If mmap fails (minigzip used in a - * pipe), use the normal fread loop. - */ - if (gz_compress_mmap(in, out) == Z_OK) return; -#endif - for (;;) { - len = (int)fread(buf, 1, sizeof(buf), in); - if (ferror(in)) { - perror("fread"); - exit(1); - } - if (len == 0) break; - - if (gzwrite(out, buf, (unsigned)len) != len) error(gzerror(out, &err)); - } - fclose(in); - if (gzclose(out) != Z_OK) error("failed gzclose"); -} - #ifdef USE_MMAP /* MMAP version, Miguel Albrecht */ /* Try compressing the input file at once using mmap. Return Z_OK if - * if success, Z_ERRNO otherwise. + * success, Z_ERRNO otherwise. */ -int gz_compress_mmap(in, out) - FILE *in; - gzFile out; -{ +static int gz_compress_mmap(FILE *in, gzFile out) { int len; int err; int ifd = fileno(in); @@ -424,13 +334,39 @@ int gz_compress_mmap(in, out) } #endif /* USE_MMAP */ +/* =========================================================================== + * Compress input to output then close both files. + */ + +static void gz_compress(FILE *in, gzFile out) { + local char buf[BUFLEN]; + int len; + int err; + +#ifdef USE_MMAP + /* Try first compressing with mmap. If mmap fails (minigzip used in a + * pipe), use the normal fread loop. + */ + if (gz_compress_mmap(in, out) == Z_OK) return; +#endif + for (;;) { + len = (int)fread(buf, 1, sizeof(buf), in); + if (ferror(in)) { + perror("fread"); + exit(1); + } + if (len == 0) break; + + if (gzwrite(out, buf, (unsigned)len) != len) error(gzerror(out, &err)); + } + fclose(in); + if (gzclose(out) != Z_OK) error("failed gzclose"); +} + /* =========================================================================== * Uncompress input to output then close both files. */ -void gz_uncompress(in, out) - gzFile in; - FILE *out; -{ +static void gz_uncompress(gzFile in, FILE *out) { local char buf[BUFLEN]; int len; int err; @@ -454,10 +390,7 @@ void gz_uncompress(in, out) * Compress the given file: create a corresponding .gz file and remove the * original. */ -void file_compress(file, mode) - char *file; - char *mode; -{ +static void file_compress(char *file, char *mode) { local char outfile[MAX_NAME_LEN]; FILE *in; gzFile out; @@ -493,14 +426,12 @@ void file_compress(file, mode) /* =========================================================================== * Uncompress the given file and remove the original. */ -void file_uncompress(file) - char *file; -{ +static void file_uncompress(char *file) { local char buf[MAX_NAME_LEN]; char *infile, *outfile; FILE *out; gzFile in; - unsigned len = strlen(file); + z_size_t len = strlen(file); if (len + strlen(GZ_SUFFIX) >= sizeof(buf)) { fprintf(stderr, "%s: filename too long\n", prog); @@ -553,10 +484,7 @@ void file_uncompress(file) * -1 to -9 : compression level */ -int main(argc, argv) - int argc; - char *argv[]; -{ +int main(int argc, char *argv[]) { int copyout = 0; int uncompr = 0; gzFile file; diff --git a/zlib/treebuild.xml b/zlib/treebuild.xml index fd75525f9959..930b00be4a85 100644 --- a/zlib/treebuild.xml +++ b/zlib/treebuild.xml @@ -1,6 +1,6 @@ - - + + zip compression library diff --git a/zlib/trees.c b/zlib/trees.c index d0a09b119ab1..6a523ef34e3c 100644 --- a/zlib/trees.c +++ b/zlib/trees.c @@ -1,5 +1,5 @@ /* trees.c -- output deflated data using Huffman coding - * Copyright (C) 1995-2017 Jean-loup Gailly + * Copyright (C) 1995-2024 Jean-loup Gailly * detect_data_type() function provided freely by Cosmin Truta, 2006 * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -30,7 +30,7 @@ * Addison-Wesley, 1983. ISBN 0-201-06672-6. */ -/* @(#) $Id: trees.c,v 1.1.1.2 2002/03/11 21:53:27 tromey Exp $ */ +/* @(#) $Id$ */ /* #define GEN_TREES_H */ @@ -122,39 +122,116 @@ struct static_tree_desc_s { int max_length; /* max bit length for the codes */ }; -local const static_tree_desc static_l_desc = +#ifdef NO_INIT_GLOBAL_POINTERS +# define TCONST +#else +# define TCONST const +#endif + +local TCONST static_tree_desc static_l_desc = {static_ltree, extra_lbits, LITERALS+1, L_CODES, MAX_BITS}; -local const static_tree_desc static_d_desc = +local TCONST static_tree_desc static_d_desc = {static_dtree, extra_dbits, 0, D_CODES, MAX_BITS}; -local const static_tree_desc static_bl_desc = +local TCONST static_tree_desc static_bl_desc = {(const ct_data *)0, extra_blbits, 0, BL_CODES, MAX_BL_BITS}; /* =========================================================================== - * Local (static) routines in this file. + * Output a short LSB first on the stream. + * IN assertion: there is enough room in pendingBuf. + */ +#define put_short(s, w) { \ + put_byte(s, (uch)((w) & 0xff)); \ + put_byte(s, (uch)((ush)(w) >> 8)); \ +} + +/* =========================================================================== + * Reverse the first len bits of a code, using straightforward code (a faster + * method would use a table) + * IN assertion: 1 <= len <= 15 */ +local unsigned bi_reverse(unsigned code, int len) { + register unsigned res = 0; + do { + res |= code & 1; + code >>= 1, res <<= 1; + } while (--len > 0); + return res >> 1; +} -local void tr_static_init OF((void)); -local void init_block OF((deflate_state *s)); -local void pqdownheap OF((deflate_state *s, ct_data *tree, int k)); -local void gen_bitlen OF((deflate_state *s, tree_desc *desc)); -local void gen_codes OF((ct_data *tree, int max_code, ushf *bl_count)); -local void build_tree OF((deflate_state *s, tree_desc *desc)); -local void scan_tree OF((deflate_state *s, ct_data *tree, int max_code)); -local void send_tree OF((deflate_state *s, ct_data *tree, int max_code)); -local int build_bl_tree OF((deflate_state *s)); -local void send_all_trees OF((deflate_state *s, int lcodes, int dcodes, - int blcodes)); -local void compress_block OF((deflate_state *s, const ct_data *ltree, - const ct_data *dtree)); -local int detect_data_type OF((deflate_state *s)); -local unsigned bi_reverse OF((unsigned value, int length)); -local void bi_windup OF((deflate_state *s)); -local void bi_flush OF((deflate_state *s)); +/* =========================================================================== + * Flush the bit buffer, keeping at most 7 bits in it. + */ +local void bi_flush(deflate_state *s) { + if (s->bi_valid == 16) { + put_short(s, s->bi_buf); + s->bi_buf = 0; + s->bi_valid = 0; + } else if (s->bi_valid >= 8) { + put_byte(s, (Byte)s->bi_buf); + s->bi_buf >>= 8; + s->bi_valid -= 8; + } +} + +/* =========================================================================== + * Flush the bit buffer and align the output on a byte boundary + */ +local void bi_windup(deflate_state *s) { + if (s->bi_valid > 8) { + put_short(s, s->bi_buf); + } else if (s->bi_valid > 0) { + put_byte(s, (Byte)s->bi_buf); + } + s->bi_buf = 0; + s->bi_valid = 0; +#ifdef ZLIB_DEBUG + s->bits_sent = (s->bits_sent + 7) & ~7; +#endif +} + +/* =========================================================================== + * Generate the codes for a given tree and bit counts (which need not be + * optimal). + * IN assertion: the array bl_count contains the bit length statistics for + * the given tree and the field len is set for all tree elements. + * OUT assertion: the field code is set for all tree elements of non + * zero code length. + */ +local void gen_codes(ct_data *tree, int max_code, ushf *bl_count) { + ush next_code[MAX_BITS+1]; /* next code value for each bit length */ + unsigned code = 0; /* running code value */ + int bits; /* bit index */ + int n; /* code index */ + + /* The distribution counts are first used to generate the code values + * without bit reversal. + */ + for (bits = 1; bits <= MAX_BITS; bits++) { + code = (code + bl_count[bits - 1]) << 1; + next_code[bits] = (ush)code; + } + /* Check that the bit counts in bl_count are consistent. The last code + * must be all ones. + */ + Assert (code + bl_count[MAX_BITS] - 1 == (1 << MAX_BITS) - 1, + "inconsistent bit counts"); + Tracev((stderr,"\ngen_codes: max_code %d ", max_code)); + + for (n = 0; n <= max_code; n++) { + int len = tree[n].Len; + if (len == 0) continue; + /* Now reverse the bits */ + tree[n].Code = (ush)bi_reverse(next_code[len]++, len); + + Tracecv(tree != static_ltree, (stderr,"\nn %3d %c l %2d c %4x (%x) ", + n, (isgraph(n) ? n : ' '), len, tree[n].Code, next_code[len] - 1)); + } +} #ifdef GEN_TREES_H -local void gen_trees_header OF((void)); +local void gen_trees_header(void); #endif #ifndef ZLIB_DEBUG @@ -167,33 +244,18 @@ local void gen_trees_header OF((void)); send_bits(s, tree[c].Code, tree[c].Len); } #endif -/* =========================================================================== - * Output a short LSB first on the stream. - * IN assertion: there is enough room in pendingBuf. - */ -#define put_short(s, w) { \ - put_byte(s, (uch)((w) & 0xff)); \ - put_byte(s, (uch)((ush)(w) >> 8)); \ -} - /* =========================================================================== * Send a value on a given number of bits. * IN assertion: length <= 16 and value fits in length bits. */ #ifdef ZLIB_DEBUG -local void send_bits OF((deflate_state *s, int value, int length)); - -local void send_bits(s, value, length) - deflate_state *s; - int value; /* value to send */ - int length; /* number of bits */ -{ +local void send_bits(deflate_state *s, int value, int length) { Tracevv((stderr," l %2d v %4x ", length, value)); Assert(length > 0 && length <= 15, "invalid length"); s->bits_sent += (ulg)length; /* If not enough room in bi_buf, use (valid) bits from bi_buf and - * (16 - bi_valid) bits from value, leaving (width - (16-bi_valid)) + * (16 - bi_valid) bits from value, leaving (width - (16 - bi_valid)) * unused bits in value. */ if (s->bi_valid > (int)Buf_size - length) { @@ -229,8 +291,7 @@ local void send_bits(s, value, length) /* =========================================================================== * Initialize the various 'constant' tables. */ -local void tr_static_init() -{ +local void tr_static_init(void) { #if defined(GEN_TREES_H) || !defined(STDC) static int static_init_done = 0; int n; /* iterates over tree elements */ @@ -256,7 +317,7 @@ local void tr_static_init() length = 0; for (code = 0; code < LENGTH_CODES-1; code++) { base_length[code] = length; - for (n = 0; n < (1< dist code (0..29) */ dist = 0; for (code = 0 ; code < 16; code++) { base_dist[code] = dist; - for (n = 0; n < (1<>= 7; /* from now on, all distances are divided by 128 */ for ( ; code < D_CODES; code++) { base_dist[code] = dist << 7; - for (n = 0; n < (1<<(extra_dbits[code]-7)); n++) { + for (n = 0; n < (1 << (extra_dbits[code] - 7)); n++) { _dist_code[256 + dist++] = (uch)code; } } - Assert (dist == 256, "tr_static_init: 256+dist != 512"); + Assert (dist == 256, "tr_static_init: 256 + dist != 512"); /* Construct the codes of the static literal tree */ for (bits = 0; bits <= MAX_BITS; bits++) bl_count[bits] = 0; @@ -312,7 +373,7 @@ local void tr_static_init() } /* =========================================================================== - * Genererate the file trees.h describing the static trees. + * Generate the file trees.h describing the static trees. */ #ifdef GEN_TREES_H # ifndef ZLIB_DEBUG @@ -321,10 +382,9 @@ local void tr_static_init() # define SEPARATOR(i, last, width) \ ((i) == (last)? "\n};\n\n" : \ - ((i) % (width) == (width)-1 ? ",\n" : ", ")) + ((i) % (width) == (width) - 1 ? ",\n" : ", ")) -void gen_trees_header() -{ +void gen_trees_header(void) { FILE *header = fopen("trees.h", "w"); int i; @@ -373,12 +433,26 @@ void gen_trees_header() } #endif /* GEN_TREES_H */ +/* =========================================================================== + * Initialize a new block. + */ +local void init_block(deflate_state *s) { + int n; /* iterates over tree elements */ + + /* Initialize the trees. */ + for (n = 0; n < L_CODES; n++) s->dyn_ltree[n].Freq = 0; + for (n = 0; n < D_CODES; n++) s->dyn_dtree[n].Freq = 0; + for (n = 0; n < BL_CODES; n++) s->bl_tree[n].Freq = 0; + + s->dyn_ltree[END_BLOCK].Freq = 1; + s->opt_len = s->static_len = 0L; + s->sym_next = s->matches = 0; +} + /* =========================================================================== * Initialize the tree data structures for a new zlib stream. */ -void ZLIB_INTERNAL _tr_init(s) - deflate_state *s; -{ +void ZLIB_INTERNAL _tr_init(deflate_state *s) { tr_static_init(); s->l_desc.dyn_tree = s->dyn_ltree; @@ -401,24 +475,6 @@ void ZLIB_INTERNAL _tr_init(s) init_block(s); } -/* =========================================================================== - * Initialize a new block. - */ -local void init_block(s) - deflate_state *s; -{ - int n; /* iterates over tree elements */ - - /* Initialize the trees. */ - for (n = 0; n < L_CODES; n++) s->dyn_ltree[n].Freq = 0; - for (n = 0; n < D_CODES; n++) s->dyn_dtree[n].Freq = 0; - for (n = 0; n < BL_CODES; n++) s->bl_tree[n].Freq = 0; - - s->dyn_ltree[END_BLOCK].Freq = 1; - s->opt_len = s->static_len = 0L; - s->last_lit = s->matches = 0; -} - #define SMALLEST 1 /* Index within the heap array of least frequent node in the Huffman tree */ @@ -448,17 +504,13 @@ local void init_block(s) * when the heap property is re-established (each father smaller than its * two sons). */ -local void pqdownheap(s, tree, k) - deflate_state *s; - ct_data *tree; /* the tree to restore */ - int k; /* node to move down */ -{ +local void pqdownheap(deflate_state *s, ct_data *tree, int k) { int v = s->heap[k]; int j = k << 1; /* left son of k */ while (j <= s->heap_len) { /* Set j to the smallest of the two sons: */ if (j < s->heap_len && - smaller(tree, s->heap[j+1], s->heap[j], s->depth)) { + smaller(tree, s->heap[j + 1], s->heap[j], s->depth)) { j++; } /* Exit if v is smaller than both sons */ @@ -483,10 +535,7 @@ local void pqdownheap(s, tree, k) * The length opt_len is updated; static_len is also updated if stree is * not null. */ -local void gen_bitlen(s, desc) - deflate_state *s; - tree_desc *desc; /* the tree descriptor */ -{ +local void gen_bitlen(deflate_state *s, tree_desc *desc) { ct_data *tree = desc->dyn_tree; int max_code = desc->max_code; const ct_data *stree = desc->stat_desc->static_tree; @@ -507,7 +556,7 @@ local void gen_bitlen(s, desc) */ tree[s->heap[s->heap_max]].Len = 0; /* root of the heap */ - for (h = s->heap_max+1; h < HEAP_SIZE; h++) { + for (h = s->heap_max + 1; h < HEAP_SIZE; h++) { n = s->heap[h]; bits = tree[tree[n].Dad].Len + 1; if (bits > max_length) bits = max_length, overflow++; @@ -518,7 +567,7 @@ local void gen_bitlen(s, desc) s->bl_count[bits]++; xbits = 0; - if (n >= base) xbits = extra[n-base]; + if (n >= base) xbits = extra[n - base]; f = tree[n].Freq; s->opt_len += (ulg)f * (unsigned)(bits + xbits); if (stree) s->static_len += (ulg)f * (unsigned)(stree[n].Len + xbits); @@ -530,10 +579,10 @@ local void gen_bitlen(s, desc) /* Find the first bit length which could increase: */ do { - bits = max_length-1; + bits = max_length - 1; while (s->bl_count[bits] == 0) bits--; - s->bl_count[bits]--; /* move one leaf down the tree */ - s->bl_count[bits+1] += 2; /* move one overflow item as its brother */ + s->bl_count[bits]--; /* move one leaf down the tree */ + s->bl_count[bits + 1] += 2; /* move one overflow item as its brother */ s->bl_count[max_length]--; /* The brother of the overflow item also moves one step up, * but this does not affect bl_count[max_length] @@ -561,48 +610,9 @@ local void gen_bitlen(s, desc) } } -/* =========================================================================== - * Generate the codes for a given tree and bit counts (which need not be - * optimal). - * IN assertion: the array bl_count contains the bit length statistics for - * the given tree and the field len is set for all tree elements. - * OUT assertion: the field code is set for all tree elements of non - * zero code length. - */ -local void gen_codes (tree, max_code, bl_count) - ct_data *tree; /* the tree to decorate */ - int max_code; /* largest code with non zero frequency */ - ushf *bl_count; /* number of codes at each bit length */ -{ - ush next_code[MAX_BITS+1]; /* next code value for each bit length */ - unsigned code = 0; /* running code value */ - int bits; /* bit index */ - int n; /* code index */ - - /* The distribution counts are first used to generate the code values - * without bit reversal. - */ - for (bits = 1; bits <= MAX_BITS; bits++) { - code = (code + bl_count[bits-1]) << 1; - next_code[bits] = (ush)code; - } - /* Check that the bit counts in bl_count are consistent. The last code - * must be all ones. - */ - Assert (code + bl_count[MAX_BITS]-1 == (1< +#endif /* =========================================================================== * Construct one Huffman tree and assigns the code bit strings and lengths. @@ -612,10 +622,7 @@ local void gen_codes (tree, max_code, bl_count) * and corresponding code. The length opt_len is updated; static_len is * also updated if stree is not null. The field max_code is set. */ -local void build_tree(s, desc) - deflate_state *s; - tree_desc *desc; /* the tree descriptor */ -{ +local void build_tree(deflate_state *s, tree_desc *desc) { ct_data *tree = desc->dyn_tree; const ct_data *stree = desc->stat_desc->static_tree; int elems = desc->stat_desc->elems; @@ -624,7 +631,7 @@ local void build_tree(s, desc) int node; /* new node being created */ /* Construct the initial heap, with least frequent element in - * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1]. + * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n + 1]. * heap[0] is not used. */ s->heap_len = 0, s->heap_max = HEAP_SIZE; @@ -652,7 +659,7 @@ local void build_tree(s, desc) } desc->max_code = max_code; - /* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree, + /* The elements heap[heap_len/2 + 1 .. heap_len] are leaves of the tree, * establish sub-heaps of increasing lengths: */ for (n = s->heap_len/2; n >= 1; n--) pqdownheap(s, tree, n); @@ -700,11 +707,7 @@ local void build_tree(s, desc) * Scan a literal or distance tree to determine the frequencies of the codes * in the bit length tree. */ -local void scan_tree (s, tree, max_code) - deflate_state *s; - ct_data *tree; /* the tree to be scanned */ - int max_code; /* and its largest code of non zero frequency */ -{ +local void scan_tree(deflate_state *s, ct_data *tree, int max_code) { int n; /* iterates over all tree elements */ int prevlen = -1; /* last emitted length */ int curlen; /* length of current code */ @@ -714,10 +717,10 @@ local void scan_tree (s, tree, max_code) int min_count = 4; /* min repeat count */ if (nextlen == 0) max_count = 138, min_count = 3; - tree[max_code+1].Len = (ush)0xffff; /* guard */ + tree[max_code + 1].Len = (ush)0xffff; /* guard */ for (n = 0; n <= max_code; n++) { - curlen = nextlen; nextlen = tree[n+1].Len; + curlen = nextlen; nextlen = tree[n + 1].Len; if (++count < max_count && curlen == nextlen) { continue; } else if (count < min_count) { @@ -745,11 +748,7 @@ local void scan_tree (s, tree, max_code) * Send a literal or distance tree in compressed form, using the codes in * bl_tree. */ -local void send_tree (s, tree, max_code) - deflate_state *s; - ct_data *tree; /* the tree to be scanned */ - int max_code; /* and its largest code of non zero frequency */ -{ +local void send_tree(deflate_state *s, ct_data *tree, int max_code) { int n; /* iterates over all tree elements */ int prevlen = -1; /* last emitted length */ int curlen; /* length of current code */ @@ -758,11 +757,11 @@ local void send_tree (s, tree, max_code) int max_count = 7; /* max repeat count */ int min_count = 4; /* min repeat count */ - /* tree[max_code+1].Len = -1; */ /* guard already set */ + /* tree[max_code + 1].Len = -1; */ /* guard already set */ if (nextlen == 0) max_count = 138, min_count = 3; for (n = 0; n <= max_code; n++) { - curlen = nextlen; nextlen = tree[n+1].Len; + curlen = nextlen; nextlen = tree[n + 1].Len; if (++count < max_count && curlen == nextlen) { continue; } else if (count < min_count) { @@ -773,13 +772,13 @@ local void send_tree (s, tree, max_code) send_code(s, curlen, s->bl_tree); count--; } Assert(count >= 3 && count <= 6, " 3_6?"); - send_code(s, REP_3_6, s->bl_tree); send_bits(s, count-3, 2); + send_code(s, REP_3_6, s->bl_tree); send_bits(s, count - 3, 2); } else if (count <= 10) { - send_code(s, REPZ_3_10, s->bl_tree); send_bits(s, count-3, 3); + send_code(s, REPZ_3_10, s->bl_tree); send_bits(s, count - 3, 3); } else { - send_code(s, REPZ_11_138, s->bl_tree); send_bits(s, count-11, 7); + send_code(s, REPZ_11_138, s->bl_tree); send_bits(s, count - 11, 7); } count = 0; prevlen = curlen; if (nextlen == 0) { @@ -796,9 +795,7 @@ local void send_tree (s, tree, max_code) * Construct the Huffman tree for the bit lengths and return the index in * bl_order of the last bit length code to send. */ -local int build_bl_tree(s) - deflate_state *s; -{ +local int build_bl_tree(deflate_state *s) { int max_blindex; /* index of last bit length code of non zero freq */ /* Determine the bit length frequencies for literal and distance trees */ @@ -807,8 +804,8 @@ local int build_bl_tree(s) /* Build the bit length tree: */ build_tree(s, (tree_desc *)(&(s->bl_desc))); - /* opt_len now includes the length of the tree representations, except - * the lengths of the bit lengths codes and the 5+5+4 bits for the counts. + /* opt_len now includes the length of the tree representations, except the + * lengths of the bit lengths codes and the 5 + 5 + 4 bits for the counts. */ /* Determine the number of bit length codes to send. The pkzip format @@ -819,7 +816,7 @@ local int build_bl_tree(s) if (s->bl_tree[bl_order[max_blindex]].Len != 0) break; } /* Update opt_len to include the bit length tree and counts */ - s->opt_len += 3*((ulg)max_blindex+1) + 5+5+4; + s->opt_len += 3*((ulg)max_blindex + 1) + 5 + 5 + 4; Tracev((stderr, "\ndyn trees: dyn %ld, stat %ld", s->opt_len, s->static_len)); @@ -831,61 +828,54 @@ local int build_bl_tree(s) * lengths of the bit length codes, the literal tree and the distance tree. * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4. */ -local void send_all_trees(s, lcodes, dcodes, blcodes) - deflate_state *s; - int lcodes, dcodes, blcodes; /* number of codes for each tree */ -{ +local void send_all_trees(deflate_state *s, int lcodes, int dcodes, + int blcodes) { int rank; /* index in bl_order */ Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, "not enough codes"); Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES, "too many codes"); Tracev((stderr, "\nbl counts: ")); - send_bits(s, lcodes-257, 5); /* not +255 as stated in appnote.txt */ - send_bits(s, dcodes-1, 5); - send_bits(s, blcodes-4, 4); /* not -3 as stated in appnote.txt */ + send_bits(s, lcodes - 257, 5); /* not +255 as stated in appnote.txt */ + send_bits(s, dcodes - 1, 5); + send_bits(s, blcodes - 4, 4); /* not -3 as stated in appnote.txt */ for (rank = 0; rank < blcodes; rank++) { Tracev((stderr, "\nbl code %2d ", bl_order[rank])); send_bits(s, s->bl_tree[bl_order[rank]].Len, 3); } Tracev((stderr, "\nbl tree: sent %ld", s->bits_sent)); - send_tree(s, (ct_data *)s->dyn_ltree, lcodes-1); /* literal tree */ + send_tree(s, (ct_data *)s->dyn_ltree, lcodes - 1); /* literal tree */ Tracev((stderr, "\nlit tree: sent %ld", s->bits_sent)); - send_tree(s, (ct_data *)s->dyn_dtree, dcodes-1); /* distance tree */ + send_tree(s, (ct_data *)s->dyn_dtree, dcodes - 1); /* distance tree */ Tracev((stderr, "\ndist tree: sent %ld", s->bits_sent)); } /* =========================================================================== * Send a stored block */ -void ZLIB_INTERNAL _tr_stored_block(s, buf, stored_len, last) - deflate_state *s; - charf *buf; /* input block */ - ulg stored_len; /* length of input block */ - int last; /* one if this is the last block for a file */ -{ - send_bits(s, (STORED_BLOCK<<1)+last, 3); /* send block type */ +void ZLIB_INTERNAL _tr_stored_block(deflate_state *s, charf *buf, + ulg stored_len, int last) { + send_bits(s, (STORED_BLOCK<<1) + last, 3); /* send block type */ bi_windup(s); /* align on byte boundary */ put_short(s, (ush)stored_len); put_short(s, (ush)~stored_len); - zmemcpy(s->pending_buf + s->pending, (Bytef *)buf, stored_len); + if (stored_len) + zmemcpy(s->pending_buf + s->pending, (Bytef *)buf, stored_len); s->pending += stored_len; #ifdef ZLIB_DEBUG s->compressed_len = (s->compressed_len + 3 + 7) & (ulg)~7L; s->compressed_len += (stored_len + 4) << 3; s->bits_sent += 2*16; - s->bits_sent += stored_len<<3; + s->bits_sent += stored_len << 3; #endif } /* =========================================================================== * Flush the bits in the bit buffer to pending output (leaves at most 7 bits) */ -void ZLIB_INTERNAL _tr_flush_bits(s) - deflate_state *s; -{ +void ZLIB_INTERNAL _tr_flush_bits(deflate_state *s) { bi_flush(s); } @@ -893,9 +883,7 @@ void ZLIB_INTERNAL _tr_flush_bits(s) * Send one empty static block to give enough lookahead for inflate. * This takes 10 bits, of which 7 may remain in the bit buffer. */ -void ZLIB_INTERNAL _tr_align(s) - deflate_state *s; -{ +void ZLIB_INTERNAL _tr_align(deflate_state *s) { send_bits(s, STATIC_TREES<<1, 3); send_code(s, END_BLOCK, static_ltree); #ifdef ZLIB_DEBUG @@ -904,16 +892,108 @@ void ZLIB_INTERNAL _tr_align(s) bi_flush(s); } +/* =========================================================================== + * Send the block data compressed using the given Huffman trees + */ +local void compress_block(deflate_state *s, const ct_data *ltree, + const ct_data *dtree) { + unsigned dist; /* distance of matched string */ + int lc; /* match length or unmatched char (if dist == 0) */ + unsigned sx = 0; /* running index in symbol buffers */ + unsigned code; /* the code to send */ + int extra; /* number of extra bits to send */ + + if (s->sym_next != 0) do { +#ifdef LIT_MEM + dist = s->d_buf[sx]; + lc = s->l_buf[sx++]; +#else + dist = s->sym_buf[sx++] & 0xff; + dist += (unsigned)(s->sym_buf[sx++] & 0xff) << 8; + lc = s->sym_buf[sx++]; +#endif + if (dist == 0) { + send_code(s, lc, ltree); /* send a literal byte */ + Tracecv(isgraph(lc), (stderr," '%c' ", lc)); + } else { + /* Here, lc is the match length - MIN_MATCH */ + code = _length_code[lc]; + send_code(s, code + LITERALS + 1, ltree); /* send length code */ + extra = extra_lbits[code]; + if (extra != 0) { + lc -= base_length[code]; + send_bits(s, lc, extra); /* send the extra length bits */ + } + dist--; /* dist is now the match distance - 1 */ + code = d_code(dist); + Assert (code < D_CODES, "bad d_code"); + + send_code(s, code, dtree); /* send the distance code */ + extra = extra_dbits[code]; + if (extra != 0) { + dist -= (unsigned)base_dist[code]; + send_bits(s, dist, extra); /* send the extra distance bits */ + } + } /* literal or match pair ? */ + + /* Check for no overlay of pending_buf on needed symbols */ +#ifdef LIT_MEM + Assert(s->pending < 2 * (s->lit_bufsize + sx), "pendingBuf overflow"); +#else + Assert(s->pending < s->lit_bufsize + sx, "pendingBuf overflow"); +#endif + + } while (sx < s->sym_next); + + send_code(s, END_BLOCK, ltree); +} + +/* =========================================================================== + * Check if the data type is TEXT or BINARY, using the following algorithm: + * - TEXT if the two conditions below are satisfied: + * a) There are no non-portable control characters belonging to the + * "block list" (0..6, 14..25, 28..31). + * b) There is at least one printable character belonging to the + * "allow list" (9 {TAB}, 10 {LF}, 13 {CR}, 32..255). + * - BINARY otherwise. + * - The following partially-portable control characters form a + * "gray list" that is ignored in this detection algorithm: + * (7 {BEL}, 8 {BS}, 11 {VT}, 12 {FF}, 26 {SUB}, 27 {ESC}). + * IN assertion: the fields Freq of dyn_ltree are set. + */ +local int detect_data_type(deflate_state *s) { + /* block_mask is the bit mask of block-listed bytes + * set bits 0..6, 14..25, and 28..31 + * 0xf3ffc07f = binary 11110011111111111100000001111111 + */ + unsigned long block_mask = 0xf3ffc07fUL; + int n; + + /* Check for non-textual ("block-listed") bytes. */ + for (n = 0; n <= 31; n++, block_mask >>= 1) + if ((block_mask & 1) && (s->dyn_ltree[n].Freq != 0)) + return Z_BINARY; + + /* Check for textual ("allow-listed") bytes. */ + if (s->dyn_ltree[9].Freq != 0 || s->dyn_ltree[10].Freq != 0 + || s->dyn_ltree[13].Freq != 0) + return Z_TEXT; + for (n = 32; n < LITERALS; n++) + if (s->dyn_ltree[n].Freq != 0) + return Z_TEXT; + + /* There are no "block-listed" or "allow-listed" bytes: + * this stream either is empty or has tolerated ("gray-listed") bytes only. + */ + return Z_BINARY; +} + /* =========================================================================== * Determine the best encoding for the current block: dynamic trees, static * trees or store, and write out the encoded block. */ -void ZLIB_INTERNAL _tr_flush_block(s, buf, stored_len, last) - deflate_state *s; - charf *buf; /* input block, or NULL if too old */ - ulg stored_len; /* length of input block */ - int last; /* one if this is the last block for a file */ -{ +void ZLIB_INTERNAL _tr_flush_block(deflate_state *s, charf *buf, + ulg stored_len, int last) { ulg opt_lenb, static_lenb; /* opt_len and static_len in bytes */ int max_blindex = 0; /* index of last bit length code of non zero freq */ @@ -942,14 +1022,17 @@ void ZLIB_INTERNAL _tr_flush_block(s, buf, stored_len, last) max_blindex = build_bl_tree(s); /* Determine the best encoding. Compute the block lengths in bytes. */ - opt_lenb = (s->opt_len+3+7)>>3; - static_lenb = (s->static_len+3+7)>>3; + opt_lenb = (s->opt_len + 3 + 7) >> 3; + static_lenb = (s->static_len + 3 + 7) >> 3; Tracev((stderr, "\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u ", opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len, - s->last_lit)); + s->sym_next / 3)); - if (static_lenb <= opt_lenb) opt_lenb = static_lenb; +#ifndef FORCE_STATIC + if (static_lenb <= opt_lenb || s->strategy == Z_FIXED) +#endif + opt_lenb = static_lenb; } else { Assert(buf != (char*)0, "lost buf"); @@ -959,7 +1042,7 @@ void ZLIB_INTERNAL _tr_flush_block(s, buf, stored_len, last) #ifdef FORCE_STORED if (buf != (char*)0) { /* force stored block */ #else - if (stored_len+4 <= opt_lenb && buf != (char*)0) { + if (stored_len + 4 <= opt_lenb && buf != (char*)0) { /* 4: two words for the lengths */ #endif /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE. @@ -970,21 +1053,17 @@ void ZLIB_INTERNAL _tr_flush_block(s, buf, stored_len, last) */ _tr_stored_block(s, buf, stored_len, last); -#ifdef FORCE_STATIC - } else if (static_lenb >= 0) { /* force static trees */ -#else - } else if (s->strategy == Z_FIXED || static_lenb == opt_lenb) { -#endif - send_bits(s, (STATIC_TREES<<1)+last, 3); + } else if (static_lenb == opt_lenb) { + send_bits(s, (STATIC_TREES<<1) + last, 3); compress_block(s, (const ct_data *)static_ltree, (const ct_data *)static_dtree); #ifdef ZLIB_DEBUG s->compressed_len += 3 + s->static_len; #endif } else { - send_bits(s, (DYN_TREES<<1)+last, 3); - send_all_trees(s, s->l_desc.max_code+1, s->d_desc.max_code+1, - max_blindex+1); + send_bits(s, (DYN_TREES<<1) + last, 3); + send_all_trees(s, s->l_desc.max_code + 1, s->d_desc.max_code + 1, + max_blindex + 1); compress_block(s, (const ct_data *)s->dyn_ltree, (const ct_data *)s->dyn_dtree); #ifdef ZLIB_DEBUG @@ -1003,21 +1082,23 @@ void ZLIB_INTERNAL _tr_flush_block(s, buf, stored_len, last) s->compressed_len += 7; /* align on byte boundary */ #endif } - Tracev((stderr,"\ncomprlen %lu(%lu) ", s->compressed_len>>3, - s->compressed_len-7*last)); + Tracev((stderr,"\ncomprlen %lu(%lu) ", s->compressed_len >> 3, + s->compressed_len - 7*last)); } /* =========================================================================== * Save the match info and tally the frequency counts. Return true if * the current block must be flushed. */ -int ZLIB_INTERNAL _tr_tally (s, dist, lc) - deflate_state *s; - unsigned dist; /* distance of matched string */ - unsigned lc; /* match length-MIN_MATCH or unmatched char (if dist==0) */ -{ - s->d_buf[s->last_lit] = (ush)dist; - s->l_buf[s->last_lit++] = (uch)lc; +int ZLIB_INTERNAL _tr_tally(deflate_state *s, unsigned dist, unsigned lc) { +#ifdef LIT_MEM + s->d_buf[s->sym_next] = (ush)dist; + s->l_buf[s->sym_next++] = (uch)lc; +#else + s->sym_buf[s->sym_next++] = (uch)dist; + s->sym_buf[s->sym_next++] = (uch)(dist >> 8); + s->sym_buf[s->sym_next++] = (uch)lc; +#endif if (dist == 0) { /* lc is the unmatched char */ s->dyn_ltree[lc].Freq++; @@ -1029,175 +1110,8 @@ int ZLIB_INTERNAL _tr_tally (s, dist, lc) (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) && (ush)d_code(dist) < (ush)D_CODES, "_tr_tally: bad match"); - s->dyn_ltree[_length_code[lc]+LITERALS+1].Freq++; + s->dyn_ltree[_length_code[lc] + LITERALS + 1].Freq++; s->dyn_dtree[d_code(dist)].Freq++; } - -#ifdef TRUNCATE_BLOCK - /* Try to guess if it is profitable to stop the current block here */ - if ((s->last_lit & 0x1fff) == 0 && s->level > 2) { - /* Compute an upper bound for the compressed length */ - ulg out_length = (ulg)s->last_lit*8L; - ulg in_length = (ulg)((long)s->strstart - s->block_start); - int dcode; - for (dcode = 0; dcode < D_CODES; dcode++) { - out_length += (ulg)s->dyn_dtree[dcode].Freq * - (5L+extra_dbits[dcode]); - } - out_length >>= 3; - Tracev((stderr,"\nlast_lit %u, in %ld, out ~%ld(%ld%%) ", - s->last_lit, in_length, out_length, - 100L - out_length*100L/in_length)); - if (s->matches < s->last_lit/2 && out_length < in_length/2) return 1; - } -#endif - return (s->last_lit == s->lit_bufsize-1); - /* We avoid equality with lit_bufsize because of wraparound at 64K - * on 16 bit machines and because stored blocks are restricted to - * 64K-1 bytes. - */ -} - -/* =========================================================================== - * Send the block data compressed using the given Huffman trees - */ -local void compress_block(s, ltree, dtree) - deflate_state *s; - const ct_data *ltree; /* literal tree */ - const ct_data *dtree; /* distance tree */ -{ - unsigned dist; /* distance of matched string */ - int lc; /* match length or unmatched char (if dist == 0) */ - unsigned lx = 0; /* running index in l_buf */ - unsigned code; /* the code to send */ - int extra; /* number of extra bits to send */ - - if (s->last_lit != 0) do { - dist = s->d_buf[lx]; - lc = s->l_buf[lx++]; - if (dist == 0) { - send_code(s, lc, ltree); /* send a literal byte */ - Tracecv(isgraph(lc), (stderr," '%c' ", lc)); - } else { - /* Here, lc is the match length - MIN_MATCH */ - code = _length_code[lc]; - send_code(s, code+LITERALS+1, ltree); /* send the length code */ - extra = extra_lbits[code]; - if (extra != 0) { - lc -= base_length[code]; - send_bits(s, lc, extra); /* send the extra length bits */ - } - dist--; /* dist is now the match distance - 1 */ - code = d_code(dist); - Assert (code < D_CODES, "bad d_code"); - - send_code(s, code, dtree); /* send the distance code */ - extra = extra_dbits[code]; - if (extra != 0) { - dist -= (unsigned)base_dist[code]; - send_bits(s, dist, extra); /* send the extra distance bits */ - } - } /* literal or match pair ? */ - - /* Check that the overlay between pending_buf and d_buf+l_buf is ok: */ - Assert((uInt)(s->pending) < s->lit_bufsize + 2*lx, - "pendingBuf overflow"); - - } while (lx < s->last_lit); - - send_code(s, END_BLOCK, ltree); -} - -/* =========================================================================== - * Check if the data type is TEXT or BINARY, using the following algorithm: - * - TEXT if the two conditions below are satisfied: - * a) There are no non-portable control characters belonging to the - * "black list" (0..6, 14..25, 28..31). - * b) There is at least one printable character belonging to the - * "white list" (9 {TAB}, 10 {LF}, 13 {CR}, 32..255). - * - BINARY otherwise. - * - The following partially-portable control characters form a - * "gray list" that is ignored in this detection algorithm: - * (7 {BEL}, 8 {BS}, 11 {VT}, 12 {FF}, 26 {SUB}, 27 {ESC}). - * IN assertion: the fields Freq of dyn_ltree are set. - */ -local int detect_data_type(s) - deflate_state *s; -{ - /* black_mask is the bit mask of black-listed bytes - * set bits 0..6, 14..25, and 28..31 - * 0xf3ffc07f = binary 11110011111111111100000001111111 - */ - unsigned long black_mask = 0xf3ffc07fUL; - int n; - - /* Check for non-textual ("black-listed") bytes. */ - for (n = 0; n <= 31; n++, black_mask >>= 1) - if ((black_mask & 1) && (s->dyn_ltree[n].Freq != 0)) - return Z_BINARY; - - /* Check for textual ("white-listed") bytes. */ - if (s->dyn_ltree[9].Freq != 0 || s->dyn_ltree[10].Freq != 0 - || s->dyn_ltree[13].Freq != 0) - return Z_TEXT; - for (n = 32; n < LITERALS; n++) - if (s->dyn_ltree[n].Freq != 0) - return Z_TEXT; - - /* There are no "black-listed" or "white-listed" bytes: - * this stream either is empty or has tolerated ("gray-listed") bytes only. - */ - return Z_BINARY; -} - -/* =========================================================================== - * Reverse the first len bits of a code, using straightforward code (a faster - * method would use a table) - * IN assertion: 1 <= len <= 15 - */ -local unsigned bi_reverse(code, len) - unsigned code; /* the value to invert */ - int len; /* its bit length */ -{ - register unsigned res = 0; - do { - res |= code & 1; - code >>= 1, res <<= 1; - } while (--len > 0); - return res >> 1; -} - -/* =========================================================================== - * Flush the bit buffer, keeping at most 7 bits in it. - */ -local void bi_flush(s) - deflate_state *s; -{ - if (s->bi_valid == 16) { - put_short(s, s->bi_buf); - s->bi_buf = 0; - s->bi_valid = 0; - } else if (s->bi_valid >= 8) { - put_byte(s, (Byte)s->bi_buf); - s->bi_buf >>= 8; - s->bi_valid -= 8; - } -} - -/* =========================================================================== - * Flush the bit buffer and align the output on a byte boundary - */ -local void bi_windup(s) - deflate_state *s; -{ - if (s->bi_valid > 8) { - put_short(s, s->bi_buf); - } else if (s->bi_valid > 0) { - put_byte(s, (Byte)s->bi_buf); - } - s->bi_buf = 0; - s->bi_valid = 0; -#ifdef ZLIB_DEBUG - s->bits_sent = (s->bits_sent+7) & ~7; -#endif + return (s->sym_next == s->sym_end); } diff --git a/zlib/uncompr.c b/zlib/uncompr.c index a6ef81e1cded..5e256663b451 100644 --- a/zlib/uncompr.c +++ b/zlib/uncompr.c @@ -3,7 +3,7 @@ * For conditions of distribution and use, see copyright notice in zlib.h */ -/* @(#) $Id: uncompr.c,v 1.1.1.2 2002/03/11 21:53:27 tromey Exp $ */ +/* @(#) $Id$ */ #define ZLIB_INTERNAL #include "zlib.h" @@ -24,12 +24,8 @@ Z_DATA_ERROR if the input data was corrupted, including if the input data is an incomplete zlib stream. */ -int ZEXPORT uncompress2 (dest, destLen, source, sourceLen) - Bytef *dest; - uLongf *destLen; - const Bytef *source; - uLong *sourceLen; -{ +int ZEXPORT uncompress2(Bytef *dest, uLongf *destLen, const Bytef *source, + uLong *sourceLen) { z_stream stream; int err; const uInt max = (uInt)-1; @@ -83,11 +79,7 @@ int ZEXPORT uncompress2 (dest, destLen, source, sourceLen) err; } -int ZEXPORT uncompress (dest, destLen, source, sourceLen) - Bytef *dest; - uLongf *destLen; - const Bytef *source; - uLong sourceLen; -{ +int ZEXPORT uncompress(Bytef *dest, uLongf *destLen, const Bytef *source, + uLong sourceLen) { return uncompress2(dest, destLen, source, &sourceLen); } diff --git a/zlib/win32/DLL_FAQ.txt b/zlib/win32/DLL_FAQ.txt index 12c009018c37..d8cf5f31e3d8 100644 --- a/zlib/win32/DLL_FAQ.txt +++ b/zlib/win32/DLL_FAQ.txt @@ -3,7 +3,7 @@ This document describes the design, the rationale, and the usage -of the official DLL build of zlib, named ZLIB1.DLL. If you have +of the common DLL build of zlib, named ZLIB1.DLL. If you have general questions about zlib, you should see the file "FAQ" found in the zlib distribution, or at the following location: http://www.gzip.org/zlib/zlib_faq.html @@ -11,13 +11,9 @@ in the zlib distribution, or at the following location: 1. What is ZLIB1.DLL, and how can I get it? - - ZLIB1.DLL is the official build of zlib as a DLL. + - ZLIB1.DLL is the common build of zlib as a DLL. (Please remark the character '1' in the name.) - Pointers to a precompiled ZLIB1.DLL can be found in the zlib - web site at: - http://www.zlib.net/ - Applications that link to ZLIB1.DLL can rely on the following specification: @@ -379,18 +375,6 @@ in the zlib distribution, or at the following location: code. But you can make your own private DLL build, under a different file name, as suggested in the previous answer. - -17. I made my own ZLIB1.DLL build. Can I test it for compliance? - - - We prefer that you download the official DLL from the zlib - web site. If you need something peculiar from this DLL, you - can send your suggestion to the zlib mailing list. - - However, in case you do rebuild the DLL yourself, you can run - it with the test programs found in the DLL distribution. - Running these test programs is not a guarantee of compliance, - but a failure can imply a detected problem. - ** This document is written and maintained by diff --git a/zlib/win32/Makefile.bor b/zlib/win32/Makefile.bor index d152bbb7ffd9..4495353f3f54 100644 --- a/zlib/win32/Makefile.bor +++ b/zlib/win32/Makefile.bor @@ -3,7 +3,6 @@ # # Usage: # make -f win32/Makefile.bor -# make -f win32/Makefile.bor LOCAL_ZLIB=-DASMV OBJA=match.obj OBJPA=+match.obj # ------------ Borland C++ ------------ diff --git a/zlib/win32/Makefile.gcc b/zlib/win32/Makefile.gcc index 305be50afef6..081e391eb299 100644 --- a/zlib/win32/Makefile.gcc +++ b/zlib/win32/Makefile.gcc @@ -11,10 +11,6 @@ # # make -fwin32/Makefile.gcc; make test testdll -fwin32/Makefile.gcc # -# To use the asm code, type: -# cp contrib/asm?86/match.S ./match.S -# make LOC=-DASMV OBJA=match.o -fwin32/Makefile.gcc -# # To install libz.a, zconf.h and zlib.h in the system directories, type: # # make install -fwin32/Makefile.gcc @@ -38,7 +34,6 @@ IMPLIB = libz.dll.a # SHARED_MODE=0 -#LOC = -DASMV #LOC = -DZLIB_DEBUG -g PREFIX = diff --git a/zlib/win32/Makefile.msc b/zlib/win32/Makefile.msc index 6831882de43e..9c6515360e66 100644 --- a/zlib/win32/Makefile.msc +++ b/zlib/win32/Makefile.msc @@ -4,10 +4,6 @@ # Usage: # nmake -f win32/Makefile.msc (standard build) # nmake -f win32/Makefile.msc LOC=-DFOO (nonstandard build) -# nmake -f win32/Makefile.msc LOC="-DASMV -DASMINF" \ -# OBJA="inffas32.obj match686.obj" (use ASM code, x86) -# nmake -f win32/Makefile.msc AS=ml64 LOC="-DASMV -DASMINF -I." \ -# OBJA="inffasx64.obj gvmat64.obj inffas8664.obj" (use ASM code, x64) # The toplevel directory of the source tree. # diff --git a/zlib/win32/README-WIN32.txt b/zlib/win32/README-WIN32.txt index df7ab7f4b34f..14e6398ef3a8 100644 --- a/zlib/win32/README-WIN32.txt +++ b/zlib/win32/README-WIN32.txt @@ -1,6 +1,6 @@ ZLIB DATA COMPRESSION LIBRARY -zlib 1.2.11 is a general purpose data compression library. All the code is +zlib 1.3.1 is a general purpose data compression library. All the code is thread safe. The data format used by the zlib library is described by RFCs (Request for Comments) 1950 to 1952 in the files http://www.ietf.org/rfc/rfc1950.txt (zlib format), rfc1951.txt (deflate format) @@ -16,13 +16,13 @@ is http://zlib.net/ . Before reporting a problem, please check this site to verify that you have the latest version of zlib; otherwise get the latest version and check whether the problem still exists or not. -PLEASE read DLL_FAQ.txt, and the the zlib FAQ http://zlib.net/zlib_faq.html -before asking for help. +PLEASE read DLL_FAQ.txt, and the zlib FAQ http://zlib.net/zlib_faq.html before +asking for help. Manifest: -The package zlib-1.2.11-win32-x86.zip will contain the following files: +The package zlib-1.3.1-win32-x86.zip will contain the following files: README-WIN32.txt This document ChangeLog Changes since previous zlib packages diff --git a/zlib/win32/zlib.def b/zlib/win32/zlib.def index 0cb3f5d48b9f..53c80115fcb6 100644 --- a/zlib/win32/zlib.def +++ b/zlib/win32/zlib.def @@ -69,6 +69,7 @@ EXPORTS gzoffset64 adler32_combine64 crc32_combine64 + crc32_combine_gen64 ; checksum functions adler32 adler32_z @@ -76,6 +77,8 @@ EXPORTS crc32_z adler32_combine crc32_combine + crc32_combine_gen + crc32_combine_op ; various hacks, don't look :) deflateInit_ deflateInit2_ @@ -91,3 +94,4 @@ EXPORTS inflateCodesUsed inflateResetKeep deflateResetKeep + gzopen_w diff --git a/zlib/win32/zlib1.rc b/zlib/win32/zlib1.rc index 234e641c3294..ceb4ee5c69e1 100644 --- a/zlib/win32/zlib1.rc +++ b/zlib/win32/zlib1.rc @@ -26,7 +26,7 @@ BEGIN VALUE "FileDescription", "zlib data compression library\0" VALUE "FileVersion", ZLIB_VERSION "\0" VALUE "InternalName", "zlib1.dll\0" - VALUE "LegalCopyright", "(C) 1995-2017 Jean-loup Gailly & Mark Adler\0" + VALUE "LegalCopyright", "(C) 1995-2022 Jean-loup Gailly & Mark Adler\0" VALUE "OriginalFilename", "zlib1.dll\0" VALUE "ProductName", "zlib\0" VALUE "ProductVersion", ZLIB_VERSION "\0" diff --git a/zlib/zconf.h b/zlib/zconf.h index b399839aa954..62adc8d8431f 100644 --- a/zlib/zconf.h +++ b/zlib/zconf.h @@ -1,9 +1,9 @@ /* zconf.h -- configuration of the zlib compression library - * Copyright (C) 1995-2016 Jean-loup Gailly, Mark Adler + * Copyright (C) 1995-2024 Jean-loup Gailly, Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ -/* @(#) $Id: zconf.h,v 1.1.1.2 2002/03/11 21:53:27 tromey Exp $ */ +/* @(#) $Id$ */ #ifndef ZCONF_H #define ZCONF_H @@ -38,6 +38,9 @@ # define crc32 z_crc32 # define crc32_combine z_crc32_combine # define crc32_combine64 z_crc32_combine64 +# define crc32_combine_gen z_crc32_combine_gen +# define crc32_combine_gen64 z_crc32_combine_gen64 +# define crc32_combine_op z_crc32_combine_op # define crc32_z z_crc32_z # define deflate z_deflate # define deflateBound z_deflateBound @@ -238,7 +241,11 @@ #endif #ifdef Z_SOLO - typedef unsigned long z_size_t; +# ifdef _WIN64 + typedef unsigned long long z_size_t; +# else + typedef unsigned long z_size_t; +# endif #else # define z_longlong long long # if defined(NO_SIZE_T) @@ -293,14 +300,6 @@ # endif #endif -#ifndef Z_ARG /* function prototypes for stdarg */ -# if defined(STDC) || defined(Z_HAVE_STDARG_H) -# define Z_ARG(args) args -# else -# define Z_ARG(args) () -# endif -#endif - /* The following definitions for FAR are needed only for MSDOS mixed * model programming (small or medium model with some far allocations). * This was tested only with MSC; for other MSDOS compilers you may have @@ -349,6 +348,9 @@ # ifdef FAR # undef FAR # endif +# ifndef WIN32_LEAN_AND_MEAN +# define WIN32_LEAN_AND_MEAN +# endif # include /* No need for _export, use ZLIB.DEF instead. */ /* For complete Windows compatibility, use WINAPI, not __stdcall. */ @@ -467,11 +469,18 @@ typedef uLong FAR uLongf; # undef _LARGEFILE64_SOURCE #endif -#if defined(__WATCOMC__) && !defined(Z_HAVE_UNISTD_H) -# define Z_HAVE_UNISTD_H +#ifndef Z_HAVE_UNISTD_H +# ifdef __WATCOMC__ +# define Z_HAVE_UNISTD_H +# endif +#endif +#ifndef Z_HAVE_UNISTD_H +# if defined(_LARGEFILE64_SOURCE) && !defined(_WIN32) +# define Z_HAVE_UNISTD_H +# endif #endif #ifndef Z_SOLO -# if defined(Z_HAVE_UNISTD_H) || defined(_LARGEFILE64_SOURCE) +# if defined(Z_HAVE_UNISTD_H) # include /* for SEEK_*, off_t, and _LFS64_LARGEFILE */ # ifdef VMS # include /* for off_t */ @@ -507,7 +516,7 @@ typedef uLong FAR uLongf; #if !defined(_WIN32) && defined(Z_LARGE64) # define z_off64_t off64_t #else -# if defined(_WIN32) && !defined(__GNUC__) && !defined(Z_SOLO) +# if defined(_WIN32) && !defined(__GNUC__) # define z_off64_t __int64 # else # define z_off64_t z_off_t @@ -531,20 +540,4 @@ typedef uLong FAR uLongf; #pragma map(inflate_copyright,"INCOPY") #endif -/* Solaris 2.5.1 doesn't have vsnprintf */ -#if defined(__sun) && defined(__svr4__) -#include -#if _XOPEN_VERSION < 3 -#define NO_vsnprintf -#endif -#endif - -/* Tru64 UNIX V4.0 neither */ -#if defined(__alpha) && defined(__osf__) -#include -#if _XOPEN_VERSION < 500 -#define NO_vsnprintf -#endif -#endif - #endif /* ZCONF_H */ diff --git a/zlib/zconf.h.cmakein b/zlib/zconf.h.cmakein index a7f24cce60ff..0abe3bc9d8fa 100644 --- a/zlib/zconf.h.cmakein +++ b/zlib/zconf.h.cmakein @@ -1,5 +1,5 @@ /* zconf.h -- configuration of the zlib compression library - * Copyright (C) 1995-2016 Jean-loup Gailly, Mark Adler + * Copyright (C) 1995-2024 Jean-loup Gailly, Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -40,6 +40,9 @@ # define crc32 z_crc32 # define crc32_combine z_crc32_combine # define crc32_combine64 z_crc32_combine64 +# define crc32_combine_gen z_crc32_combine_gen +# define crc32_combine_gen64 z_crc32_combine_gen64 +# define crc32_combine_op z_crc32_combine_op # define crc32_z z_crc32_z # define deflate z_deflate # define deflateBound z_deflateBound @@ -240,7 +243,11 @@ #endif #ifdef Z_SOLO - typedef unsigned long z_size_t; +# ifdef _WIN64 + typedef unsigned long long z_size_t; +# else + typedef unsigned long z_size_t; +# endif #else # define z_longlong long long # if defined(NO_SIZE_T) @@ -295,14 +302,6 @@ # endif #endif -#ifndef Z_ARG /* function prototypes for stdarg */ -# if defined(STDC) || defined(Z_HAVE_STDARG_H) -# define Z_ARG(args) args -# else -# define Z_ARG(args) () -# endif -#endif - /* The following definitions for FAR are needed only for MSDOS mixed * model programming (small or medium model with some far allocations). * This was tested only with MSC; for other MSDOS compilers you may have @@ -351,6 +350,9 @@ # ifdef FAR # undef FAR # endif +# ifndef WIN32_LEAN_AND_MEAN +# define WIN32_LEAN_AND_MEAN +# endif # include /* No need for _export, use ZLIB.DEF instead. */ /* For complete Windows compatibility, use WINAPI, not __stdcall. */ @@ -469,11 +471,18 @@ typedef uLong FAR uLongf; # undef _LARGEFILE64_SOURCE #endif -#if defined(__WATCOMC__) && !defined(Z_HAVE_UNISTD_H) -# define Z_HAVE_UNISTD_H +#ifndef Z_HAVE_UNISTD_H +# ifdef __WATCOMC__ +# define Z_HAVE_UNISTD_H +# endif +#endif +#ifndef Z_HAVE_UNISTD_H +# if defined(_LARGEFILE64_SOURCE) && !defined(_WIN32) +# define Z_HAVE_UNISTD_H +# endif #endif #ifndef Z_SOLO -# if defined(Z_HAVE_UNISTD_H) || defined(_LARGEFILE64_SOURCE) +# if defined(Z_HAVE_UNISTD_H) # include /* for SEEK_*, off_t, and _LFS64_LARGEFILE */ # ifdef VMS # include /* for off_t */ @@ -509,7 +518,7 @@ typedef uLong FAR uLongf; #if !defined(_WIN32) && defined(Z_LARGE64) # define z_off64_t off64_t #else -# if defined(_WIN32) && !defined(__GNUC__) && !defined(Z_SOLO) +# if defined(_WIN32) && !defined(__GNUC__) # define z_off64_t __int64 # else # define z_off64_t z_off_t diff --git a/zlib/zconf.h.in b/zlib/zconf.h.in index 5e1d68a004e9..62adc8d8431f 100644 --- a/zlib/zconf.h.in +++ b/zlib/zconf.h.in @@ -1,5 +1,5 @@ /* zconf.h -- configuration of the zlib compression library - * Copyright (C) 1995-2016 Jean-loup Gailly, Mark Adler + * Copyright (C) 1995-2024 Jean-loup Gailly, Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -38,6 +38,9 @@ # define crc32 z_crc32 # define crc32_combine z_crc32_combine # define crc32_combine64 z_crc32_combine64 +# define crc32_combine_gen z_crc32_combine_gen +# define crc32_combine_gen64 z_crc32_combine_gen64 +# define crc32_combine_op z_crc32_combine_op # define crc32_z z_crc32_z # define deflate z_deflate # define deflateBound z_deflateBound @@ -238,7 +241,11 @@ #endif #ifdef Z_SOLO - typedef unsigned long z_size_t; +# ifdef _WIN64 + typedef unsigned long long z_size_t; +# else + typedef unsigned long z_size_t; +# endif #else # define z_longlong long long # if defined(NO_SIZE_T) @@ -293,14 +300,6 @@ # endif #endif -#ifndef Z_ARG /* function prototypes for stdarg */ -# if defined(STDC) || defined(Z_HAVE_STDARG_H) -# define Z_ARG(args) args -# else -# define Z_ARG(args) () -# endif -#endif - /* The following definitions for FAR are needed only for MSDOS mixed * model programming (small or medium model with some far allocations). * This was tested only with MSC; for other MSDOS compilers you may have @@ -349,6 +348,9 @@ # ifdef FAR # undef FAR # endif +# ifndef WIN32_LEAN_AND_MEAN +# define WIN32_LEAN_AND_MEAN +# endif # include /* No need for _export, use ZLIB.DEF instead. */ /* For complete Windows compatibility, use WINAPI, not __stdcall. */ @@ -467,11 +469,18 @@ typedef uLong FAR uLongf; # undef _LARGEFILE64_SOURCE #endif -#if defined(__WATCOMC__) && !defined(Z_HAVE_UNISTD_H) -# define Z_HAVE_UNISTD_H +#ifndef Z_HAVE_UNISTD_H +# ifdef __WATCOMC__ +# define Z_HAVE_UNISTD_H +# endif +#endif +#ifndef Z_HAVE_UNISTD_H +# if defined(_LARGEFILE64_SOURCE) && !defined(_WIN32) +# define Z_HAVE_UNISTD_H +# endif #endif #ifndef Z_SOLO -# if defined(Z_HAVE_UNISTD_H) || defined(_LARGEFILE64_SOURCE) +# if defined(Z_HAVE_UNISTD_H) # include /* for SEEK_*, off_t, and _LFS64_LARGEFILE */ # ifdef VMS # include /* for off_t */ @@ -507,7 +516,7 @@ typedef uLong FAR uLongf; #if !defined(_WIN32) && defined(Z_LARGE64) # define z_off64_t off64_t #else -# if defined(_WIN32) && !defined(__GNUC__) && !defined(Z_SOLO) +# if defined(_WIN32) && !defined(__GNUC__) # define z_off64_t __int64 # else # define z_off64_t z_off_t diff --git a/zlib/zlib.3 b/zlib/zlib.3 index bda4eb073709..c716020ea9c4 100644 --- a/zlib/zlib.3 +++ b/zlib/zlib.3 @@ -1,4 +1,4 @@ -.TH ZLIB 3 "15 Jan 2017" +.TH ZLIB 3 "22 Jan 2024" .SH NAME zlib \- compression/decompression library .SH SYNOPSIS @@ -105,9 +105,9 @@ before asking for help. Send questions and/or comments to zlib@gzip.org, or (for the Windows DLL version) to Gilles Vollant (info@winimage.com). .SH AUTHORS AND LICENSE -Version 1.2.11 +Version 1.3.1 .LP -Copyright (C) 1995-2017 Jean-loup Gailly and Mark Adler +Copyright (C) 1995-2024 Jean-loup Gailly and Mark Adler .LP This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff --git a/zlib/zlib.3.pdf b/zlib/zlib.3.pdf new file mode 100644 index 0000000000000000000000000000000000000000..b224532bdd8eed1939b7dd04a7a0dd46be649c00 GIT binary patch literal 25523 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 AH~;_u literal 0 Hc-jL100001 diff --git a/zlib/zlib.h b/zlib/zlib.h index 49dfcece0e1f..8d4b932eaf6a 100644 --- a/zlib/zlib.h +++ b/zlib/zlib.h @@ -1,7 +1,7 @@ /* zlib.h -- interface of the 'zlib' general purpose compression library - version 1.2.11, January 15th, 2017 + version 1.3.1, January 22nd, 2024 - Copyright (C) 1995-2017 Jean-loup Gailly and Mark Adler + Copyright (C) 1995-2024 Jean-loup Gailly and Mark Adler This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -37,11 +37,11 @@ extern "C" { #endif -#define ZLIB_VERSION "1.2.11" -#define ZLIB_VERNUM 0x12b0 +#define ZLIB_VERSION "1.3.1" +#define ZLIB_VERNUM 0x1310 #define ZLIB_VER_MAJOR 1 -#define ZLIB_VER_MINOR 2 -#define ZLIB_VER_REVISION 11 +#define ZLIB_VER_MINOR 3 +#define ZLIB_VER_REVISION 1 #define ZLIB_VER_SUBREVISION 0 /* @@ -78,8 +78,8 @@ extern "C" { even in the case of corrupted input. */ -typedef voidpf (*alloc_func) OF((voidpf opaque, uInt items, uInt size)); -typedef void (*free_func) OF((voidpf opaque, voidpf address)); +typedef voidpf (*alloc_func)(voidpf opaque, uInt items, uInt size); +typedef void (*free_func)(voidpf opaque, voidpf address); struct internal_state; @@ -217,7 +217,7 @@ typedef gz_header FAR *gz_headerp; /* basic functions */ -ZEXTERN const char * ZEXPORT zlibVersion OF((void)); +ZEXTERN const char * ZEXPORT zlibVersion(void); /* The application can compare zlibVersion and ZLIB_VERSION for consistency. If the first character differs, the library code actually used is not compatible with the zlib.h header file used by the application. This check @@ -225,12 +225,12 @@ ZEXTERN const char * ZEXPORT zlibVersion OF((void)); */ /* -ZEXTERN int ZEXPORT deflateInit OF((z_streamp strm, int level)); +ZEXTERN int ZEXPORT deflateInit(z_streamp strm, int level); Initializes the internal stream state for compression. The fields zalloc, zfree and opaque must be initialized before by the caller. If zalloc and zfree are set to Z_NULL, deflateInit updates them to use default - allocation functions. + allocation functions. total_in, total_out, adler, and msg are initialized. The compression level must be Z_DEFAULT_COMPRESSION, or between 0 and 9: 1 gives best speed, 9 gives best compression, 0 gives no compression at all @@ -247,7 +247,7 @@ ZEXTERN int ZEXPORT deflateInit OF((z_streamp strm, int level)); */ -ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush)); +ZEXTERN int ZEXPORT deflate(z_streamp strm, int flush); /* deflate compresses as much data as possible, and stops when the input buffer becomes empty or the output buffer becomes full. It may introduce @@ -276,7 +276,7 @@ ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush)); == 0), or after each call of deflate(). If deflate returns Z_OK and with zero avail_out, it must be called again after making room in the output buffer because there might be more output pending. See deflatePending(), - which can be used if desired to determine whether or not there is more ouput + which can be used if desired to determine whether or not there is more output in that case. Normally the parameter flush is set to Z_NO_FLUSH, which allows deflate to @@ -320,8 +320,8 @@ ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush)); with the same value of the flush parameter and more output space (updated avail_out), until the flush is complete (deflate returns with non-zero avail_out). In the case of a Z_FULL_FLUSH or Z_SYNC_FLUSH, make sure that - avail_out is greater than six to avoid repeated flush markers due to - avail_out == 0 on return. + avail_out is greater than six when the flush marker begins, in order to avoid + repeated flush markers upon calling deflate() again when avail_out == 0. If the parameter flush is set to Z_FINISH, pending input is processed, pending output is flushed and deflate returns with Z_STREAM_END if there was @@ -360,7 +360,7 @@ ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush)); */ -ZEXTERN int ZEXPORT deflateEnd OF((z_streamp strm)); +ZEXTERN int ZEXPORT deflateEnd(z_streamp strm); /* All dynamically allocated data structures for this stream are freed. This function discards any unprocessed input and does not flush any pending @@ -375,7 +375,7 @@ ZEXTERN int ZEXPORT deflateEnd OF((z_streamp strm)); /* -ZEXTERN int ZEXPORT inflateInit OF((z_streamp strm)); +ZEXTERN int ZEXPORT inflateInit(z_streamp strm); Initializes the internal stream state for decompression. The fields next_in, avail_in, zalloc, zfree and opaque must be initialized before by @@ -383,7 +383,8 @@ ZEXTERN int ZEXPORT inflateInit OF((z_streamp strm)); read or consumed. The allocation of a sliding window will be deferred to the first call of inflate (if the decompression does not complete on the first call). If zalloc and zfree are set to Z_NULL, inflateInit updates - them to use default allocation functions. + them to use default allocation functions. total_in, total_out, adler, and + msg are initialized. inflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_VERSION_ERROR if the zlib library version is incompatible with the @@ -397,7 +398,7 @@ ZEXTERN int ZEXPORT inflateInit OF((z_streamp strm)); */ -ZEXTERN int ZEXPORT inflate OF((z_streamp strm, int flush)); +ZEXTERN int ZEXPORT inflate(z_streamp strm, int flush); /* inflate decompresses as much data as possible, and stops when the input buffer becomes empty or the output buffer becomes full. It may introduce @@ -517,7 +518,7 @@ ZEXTERN int ZEXPORT inflate OF((z_streamp strm, int flush)); */ -ZEXTERN int ZEXPORT inflateEnd OF((z_streamp strm)); +ZEXTERN int ZEXPORT inflateEnd(z_streamp strm); /* All dynamically allocated data structures for this stream are freed. This function discards any unprocessed input and does not flush any pending @@ -535,16 +536,15 @@ ZEXTERN int ZEXPORT inflateEnd OF((z_streamp strm)); */ /* -ZEXTERN int ZEXPORT deflateInit2 OF((z_streamp strm, - int level, - int method, - int windowBits, - int memLevel, - int strategy)); +ZEXTERN int ZEXPORT deflateInit2(z_streamp strm, + int level, + int method, + int windowBits, + int memLevel, + int strategy); This is another version of deflateInit with more compression options. The - fields next_in, zalloc, zfree and opaque must be initialized before by the - caller. + fields zalloc, zfree and opaque must be initialized before by the caller. The method parameter is the compression method. It must be Z_DEFLATED in this version of the library. @@ -608,9 +608,9 @@ ZEXTERN int ZEXPORT deflateInit2 OF((z_streamp strm, compression: this will be done by deflate(). */ -ZEXTERN int ZEXPORT deflateSetDictionary OF((z_streamp strm, - const Bytef *dictionary, - uInt dictLength)); +ZEXTERN int ZEXPORT deflateSetDictionary(z_streamp strm, + const Bytef *dictionary, + uInt dictLength); /* Initializes the compression dictionary from the given byte sequence without producing any compressed output. When using the zlib format, this @@ -652,16 +652,16 @@ ZEXTERN int ZEXPORT deflateSetDictionary OF((z_streamp strm, not perform any compression: this will be done by deflate(). */ -ZEXTERN int ZEXPORT deflateGetDictionary OF((z_streamp strm, - Bytef *dictionary, - uInt *dictLength)); +ZEXTERN int ZEXPORT deflateGetDictionary(z_streamp strm, + Bytef *dictionary, + uInt *dictLength); /* Returns the sliding dictionary being maintained by deflate. dictLength is set to the number of bytes in the dictionary, and that many bytes are copied to dictionary. dictionary must have enough space, where 32768 bytes is always enough. If deflateGetDictionary() is called with dictionary equal to Z_NULL, then only the dictionary length is returned, and nothing is copied. - Similary, if dictLength is Z_NULL, then it is not set. + Similarly, if dictLength is Z_NULL, then it is not set. deflateGetDictionary() may return a length less than the window size, even when more than the window size in input has been provided. It may return up @@ -674,8 +674,8 @@ ZEXTERN int ZEXPORT deflateGetDictionary OF((z_streamp strm, stream state is inconsistent. */ -ZEXTERN int ZEXPORT deflateCopy OF((z_streamp dest, - z_streamp source)); +ZEXTERN int ZEXPORT deflateCopy(z_streamp dest, + z_streamp source); /* Sets the destination stream as a complete copy of the source stream. @@ -692,31 +692,32 @@ ZEXTERN int ZEXPORT deflateCopy OF((z_streamp dest, destination. */ -ZEXTERN int ZEXPORT deflateReset OF((z_streamp strm)); +ZEXTERN int ZEXPORT deflateReset(z_streamp strm); /* This function is equivalent to deflateEnd followed by deflateInit, but does not free and reallocate the internal compression state. The stream will leave the compression level and any other attributes that may have been - set unchanged. + set unchanged. total_in, total_out, adler, and msg are initialized. deflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source stream state was inconsistent (such as zalloc or state being Z_NULL). */ -ZEXTERN int ZEXPORT deflateParams OF((z_streamp strm, - int level, - int strategy)); +ZEXTERN int ZEXPORT deflateParams(z_streamp strm, + int level, + int strategy); /* Dynamically update the compression level and compression strategy. The interpretation of level and strategy is as in deflateInit2(). This can be used to switch between compression and straight copy of the input data, or to switch to a different kind of input data requiring a different strategy. If the compression approach (which is a function of the level) or the - strategy is changed, and if any input has been consumed in a previous - deflate() call, then the input available so far is compressed with the old - level and strategy using deflate(strm, Z_BLOCK). There are three approaches - for the compression levels 0, 1..3, and 4..9 respectively. The new level - and strategy will take effect at the next call of deflate(). + strategy is changed, and if there have been any deflate() calls since the + state was initialized or reset, then the input available so far is + compressed with the old level and strategy using deflate(strm, Z_BLOCK). + There are three approaches for the compression levels 0, 1..3, and 4..9 + respectively. The new level and strategy will take effect at the next call + of deflate(). If a deflate(strm, Z_BLOCK) is performed by deflateParams(), and it does not have enough output space to complete, then the parameter change will not @@ -729,7 +730,7 @@ ZEXTERN int ZEXPORT deflateParams OF((z_streamp strm, Then no more input data should be provided before the deflateParams() call. If this is done, the old level and strategy will be applied to the data compressed before deflateParams(), and the new level and strategy will be - applied to the the data compressed after deflateParams(). + applied to the data compressed after deflateParams(). deflateParams returns Z_OK on success, Z_STREAM_ERROR if the source stream state was inconsistent or if a parameter was invalid, or Z_BUF_ERROR if @@ -740,11 +741,11 @@ ZEXTERN int ZEXPORT deflateParams OF((z_streamp strm, retried with more output space. */ -ZEXTERN int ZEXPORT deflateTune OF((z_streamp strm, - int good_length, - int max_lazy, - int nice_length, - int max_chain)); +ZEXTERN int ZEXPORT deflateTune(z_streamp strm, + int good_length, + int max_lazy, + int nice_length, + int max_chain); /* Fine tune deflate's internal compression parameters. This should only be used by someone who understands the algorithm used by zlib's deflate for @@ -757,8 +758,8 @@ ZEXTERN int ZEXPORT deflateTune OF((z_streamp strm, returns Z_OK on success, or Z_STREAM_ERROR for an invalid deflate stream. */ -ZEXTERN uLong ZEXPORT deflateBound OF((z_streamp strm, - uLong sourceLen)); +ZEXTERN uLong ZEXPORT deflateBound(z_streamp strm, + uLong sourceLen); /* deflateBound() returns an upper bound on the compressed size after deflation of sourceLen bytes. It must be called after deflateInit() or @@ -772,9 +773,9 @@ ZEXTERN uLong ZEXPORT deflateBound OF((z_streamp strm, than Z_FINISH or Z_NO_FLUSH are used. */ -ZEXTERN int ZEXPORT deflatePending OF((z_streamp strm, - unsigned *pending, - int *bits)); +ZEXTERN int ZEXPORT deflatePending(z_streamp strm, + unsigned *pending, + int *bits); /* deflatePending() returns the number of bytes and bits of output that have been generated, but not yet provided in the available output. The bytes not @@ -787,9 +788,9 @@ ZEXTERN int ZEXPORT deflatePending OF((z_streamp strm, stream state was inconsistent. */ -ZEXTERN int ZEXPORT deflatePrime OF((z_streamp strm, - int bits, - int value)); +ZEXTERN int ZEXPORT deflatePrime(z_streamp strm, + int bits, + int value); /* deflatePrime() inserts bits in the deflate output stream. The intent is that this function is used to start off the deflate output with the bits @@ -804,8 +805,8 @@ ZEXTERN int ZEXPORT deflatePrime OF((z_streamp strm, source stream state was inconsistent. */ -ZEXTERN int ZEXPORT deflateSetHeader OF((z_streamp strm, - gz_headerp head)); +ZEXTERN int ZEXPORT deflateSetHeader(z_streamp strm, + gz_headerp head); /* deflateSetHeader() provides gzip header information for when a gzip stream is requested by deflateInit2(). deflateSetHeader() may be called @@ -821,16 +822,17 @@ ZEXTERN int ZEXPORT deflateSetHeader OF((z_streamp strm, gzip file" and give up. If deflateSetHeader is not used, the default gzip header has text false, - the time set to zero, and os set to 255, with no extra, name, or comment - fields. The gzip header is returned to the default state by deflateReset(). + the time set to zero, and os set to the current operating system, with no + extra, name, or comment fields. The gzip header is returned to the default + state by deflateReset(). deflateSetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source stream state was inconsistent. */ /* -ZEXTERN int ZEXPORT inflateInit2 OF((z_streamp strm, - int windowBits)); +ZEXTERN int ZEXPORT inflateInit2(z_streamp strm, + int windowBits); This is another version of inflateInit with an extra parameter. The fields next_in, avail_in, zalloc, zfree and opaque must be initialized @@ -865,9 +867,11 @@ ZEXTERN int ZEXPORT inflateInit2 OF((z_streamp strm, detection, or add 16 to decode only the gzip format (the zlib format will return a Z_DATA_ERROR). If a gzip stream is being decoded, strm->adler is a CRC-32 instead of an Adler-32. Unlike the gunzip utility and gzread() (see - below), inflate() will not automatically decode concatenated gzip streams. - inflate() will return Z_STREAM_END at the end of the gzip stream. The state - would need to be reset to continue decoding a subsequent gzip stream. + below), inflate() will *not* automatically decode concatenated gzip members. + inflate() will return Z_STREAM_END at the end of the gzip member. The state + would need to be reset to continue decoding a subsequent gzip member. This + *must* be done if there is more data after a gzip member, in order for the + decompression to be compliant with the gzip standard (RFC 1952). inflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_VERSION_ERROR if the zlib library version is incompatible with the @@ -881,9 +885,9 @@ ZEXTERN int ZEXPORT inflateInit2 OF((z_streamp strm, deferred until inflate() is called. */ -ZEXTERN int ZEXPORT inflateSetDictionary OF((z_streamp strm, - const Bytef *dictionary, - uInt dictLength)); +ZEXTERN int ZEXPORT inflateSetDictionary(z_streamp strm, + const Bytef *dictionary, + uInt dictLength); /* Initializes the decompression dictionary from the given uncompressed byte sequence. This function must be called immediately after a call of inflate, @@ -904,22 +908,22 @@ ZEXTERN int ZEXPORT inflateSetDictionary OF((z_streamp strm, inflate(). */ -ZEXTERN int ZEXPORT inflateGetDictionary OF((z_streamp strm, - Bytef *dictionary, - uInt *dictLength)); +ZEXTERN int ZEXPORT inflateGetDictionary(z_streamp strm, + Bytef *dictionary, + uInt *dictLength); /* Returns the sliding dictionary being maintained by inflate. dictLength is set to the number of bytes in the dictionary, and that many bytes are copied to dictionary. dictionary must have enough space, where 32768 bytes is always enough. If inflateGetDictionary() is called with dictionary equal to Z_NULL, then only the dictionary length is returned, and nothing is copied. - Similary, if dictLength is Z_NULL, then it is not set. + Similarly, if dictLength is Z_NULL, then it is not set. inflateGetDictionary returns Z_OK on success, or Z_STREAM_ERROR if the stream state is inconsistent. */ -ZEXTERN int ZEXPORT inflateSync OF((z_streamp strm)); +ZEXTERN int ZEXPORT inflateSync(z_streamp strm); /* Skips invalid compressed data until a possible full flush point (see above for the description of deflate with Z_FULL_FLUSH) can be found, or until all @@ -932,14 +936,14 @@ ZEXTERN int ZEXPORT inflateSync OF((z_streamp strm)); inflateSync returns Z_OK if a possible full flush point has been found, Z_BUF_ERROR if no more input was provided, Z_DATA_ERROR if no flush point has been found, or Z_STREAM_ERROR if the stream structure was inconsistent. - In the success case, the application may save the current current value of - total_in which indicates where valid compressed data was found. In the - error case, the application may repeatedly call inflateSync, providing more - input each time, until success or end of the input data. + In the success case, the application may save the current value of total_in + which indicates where valid compressed data was found. In the error case, + the application may repeatedly call inflateSync, providing more input each + time, until success or end of the input data. */ -ZEXTERN int ZEXPORT inflateCopy OF((z_streamp dest, - z_streamp source)); +ZEXTERN int ZEXPORT inflateCopy(z_streamp dest, + z_streamp source); /* Sets the destination stream as a complete copy of the source stream. @@ -954,18 +958,19 @@ ZEXTERN int ZEXPORT inflateCopy OF((z_streamp dest, destination. */ -ZEXTERN int ZEXPORT inflateReset OF((z_streamp strm)); +ZEXTERN int ZEXPORT inflateReset(z_streamp strm); /* This function is equivalent to inflateEnd followed by inflateInit, but does not free and reallocate the internal decompression state. The stream will keep attributes that may have been set by inflateInit2. + total_in, total_out, adler, and msg are initialized. inflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source stream state was inconsistent (such as zalloc or state being Z_NULL). */ -ZEXTERN int ZEXPORT inflateReset2 OF((z_streamp strm, - int windowBits)); +ZEXTERN int ZEXPORT inflateReset2(z_streamp strm, + int windowBits); /* This function is the same as inflateReset, but it also permits changing the wrap and window size requests. The windowBits parameter is interpreted @@ -978,9 +983,9 @@ ZEXTERN int ZEXPORT inflateReset2 OF((z_streamp strm, the windowBits parameter is invalid. */ -ZEXTERN int ZEXPORT inflatePrime OF((z_streamp strm, - int bits, - int value)); +ZEXTERN int ZEXPORT inflatePrime(z_streamp strm, + int bits, + int value); /* This function inserts bits in the inflate input stream. The intent is that this function is used to start inflating at a bit position in the @@ -999,7 +1004,7 @@ ZEXTERN int ZEXPORT inflatePrime OF((z_streamp strm, stream state was inconsistent. */ -ZEXTERN long ZEXPORT inflateMark OF((z_streamp strm)); +ZEXTERN long ZEXPORT inflateMark(z_streamp strm); /* This function returns two values, one in the lower 16 bits of the return value, and the other in the remaining upper bits, obtained by shifting the @@ -1027,8 +1032,8 @@ ZEXTERN long ZEXPORT inflateMark OF((z_streamp strm)); source stream state was inconsistent. */ -ZEXTERN int ZEXPORT inflateGetHeader OF((z_streamp strm, - gz_headerp head)); +ZEXTERN int ZEXPORT inflateGetHeader(z_streamp strm, + gz_headerp head); /* inflateGetHeader() requests that gzip header information be stored in the provided gz_header structure. inflateGetHeader() may be called after @@ -1068,8 +1073,8 @@ ZEXTERN int ZEXPORT inflateGetHeader OF((z_streamp strm, */ /* -ZEXTERN int ZEXPORT inflateBackInit OF((z_streamp strm, int windowBits, - unsigned char FAR *window)); +ZEXTERN int ZEXPORT inflateBackInit(z_streamp strm, int windowBits, + unsigned char FAR *window); Initialize the internal stream state for decompression using inflateBack() calls. The fields zalloc, zfree and opaque in strm must be initialized @@ -1089,13 +1094,13 @@ ZEXTERN int ZEXPORT inflateBackInit OF((z_streamp strm, int windowBits, the version of the header file. */ -typedef unsigned (*in_func) OF((void FAR *, - z_const unsigned char FAR * FAR *)); -typedef int (*out_func) OF((void FAR *, unsigned char FAR *, unsigned)); +typedef unsigned (*in_func)(void FAR *, + z_const unsigned char FAR * FAR *); +typedef int (*out_func)(void FAR *, unsigned char FAR *, unsigned); -ZEXTERN int ZEXPORT inflateBack OF((z_streamp strm, - in_func in, void FAR *in_desc, - out_func out, void FAR *out_desc)); +ZEXTERN int ZEXPORT inflateBack(z_streamp strm, + in_func in, void FAR *in_desc, + out_func out, void FAR *out_desc); /* inflateBack() does a raw inflate with a single call using a call-back interface for input and output. This is potentially more efficient than @@ -1163,7 +1168,7 @@ ZEXTERN int ZEXPORT inflateBack OF((z_streamp strm, cannot return Z_OK. */ -ZEXTERN int ZEXPORT inflateBackEnd OF((z_streamp strm)); +ZEXTERN int ZEXPORT inflateBackEnd(z_streamp strm); /* All memory allocated by inflateBackInit() is freed. @@ -1171,7 +1176,7 @@ ZEXTERN int ZEXPORT inflateBackEnd OF((z_streamp strm)); state was inconsistent. */ -ZEXTERN uLong ZEXPORT zlibCompileFlags OF((void)); +ZEXTERN uLong ZEXPORT zlibCompileFlags(void); /* Return flags indicating compile-time options. Type sizes, two bits each, 00 = 16 bits, 01 = 32, 10 = 64, 11 = other: @@ -1224,8 +1229,8 @@ ZEXTERN uLong ZEXPORT zlibCompileFlags OF((void)); you need special options. */ -ZEXTERN int ZEXPORT compress OF((Bytef *dest, uLongf *destLen, - const Bytef *source, uLong sourceLen)); +ZEXTERN int ZEXPORT compress(Bytef *dest, uLongf *destLen, + const Bytef *source, uLong sourceLen); /* Compresses the source buffer into the destination buffer. sourceLen is the byte length of the source buffer. Upon entry, destLen is the total size @@ -1239,9 +1244,9 @@ ZEXTERN int ZEXPORT compress OF((Bytef *dest, uLongf *destLen, buffer. */ -ZEXTERN int ZEXPORT compress2 OF((Bytef *dest, uLongf *destLen, - const Bytef *source, uLong sourceLen, - int level)); +ZEXTERN int ZEXPORT compress2(Bytef *dest, uLongf *destLen, + const Bytef *source, uLong sourceLen, + int level); /* Compresses the source buffer into the destination buffer. The level parameter has the same meaning as in deflateInit. sourceLen is the byte @@ -1255,15 +1260,15 @@ ZEXTERN int ZEXPORT compress2 OF((Bytef *dest, uLongf *destLen, Z_STREAM_ERROR if the level parameter is invalid. */ -ZEXTERN uLong ZEXPORT compressBound OF((uLong sourceLen)); +ZEXTERN uLong ZEXPORT compressBound(uLong sourceLen); /* compressBound() returns an upper bound on the compressed size after compress() or compress2() on sourceLen bytes. It would be used before a compress() or compress2() call to allocate the destination buffer. */ -ZEXTERN int ZEXPORT uncompress OF((Bytef *dest, uLongf *destLen, - const Bytef *source, uLong sourceLen)); +ZEXTERN int ZEXPORT uncompress(Bytef *dest, uLongf *destLen, + const Bytef *source, uLong sourceLen); /* Decompresses the source buffer into the destination buffer. sourceLen is the byte length of the source buffer. Upon entry, destLen is the total size @@ -1280,8 +1285,8 @@ ZEXTERN int ZEXPORT uncompress OF((Bytef *dest, uLongf *destLen, buffer with the uncompressed data up to that point. */ -ZEXTERN int ZEXPORT uncompress2 OF((Bytef *dest, uLongf *destLen, - const Bytef *source, uLong *sourceLen)); +ZEXTERN int ZEXPORT uncompress2(Bytef *dest, uLongf *destLen, + const Bytef *source, uLong *sourceLen); /* Same as uncompress, except that sourceLen is a pointer, where the length of the source is *sourceLen. On return, *sourceLen is the number of @@ -1300,16 +1305,16 @@ ZEXTERN int ZEXPORT uncompress2 OF((Bytef *dest, uLongf *destLen, typedef struct gzFile_s *gzFile; /* semi-opaque gzip file descriptor */ /* -ZEXTERN gzFile ZEXPORT gzopen OF((const char *path, const char *mode)); +ZEXTERN gzFile ZEXPORT gzopen(const char *path, const char *mode); - Opens a gzip (.gz) file for reading or writing. The mode parameter is as - in fopen ("rb" or "wb") but can also include a compression level ("wb9") or - a strategy: 'f' for filtered data as in "wb6f", 'h' for Huffman-only - compression as in "wb1h", 'R' for run-length encoding as in "wb1R", or 'F' - for fixed code compression as in "wb9F". (See the description of - deflateInit2 for more information about the strategy parameter.) 'T' will - request transparent writing or appending with no compression and not using - the gzip format. + Open the gzip (.gz) file at path for reading and decompressing, or + compressing and writing. The mode parameter is as in fopen ("rb" or "wb") + but can also include a compression level ("wb9") or a strategy: 'f' for + filtered data as in "wb6f", 'h' for Huffman-only compression as in "wb1h", + 'R' for run-length encoding as in "wb1R", or 'F' for fixed code compression + as in "wb9F". (See the description of deflateInit2 for more information + about the strategy parameter.) 'T' will request transparent writing or + appending with no compression and not using the gzip format. "a" can be used instead of "w" to request that the gzip stream that will be written be appended to the file. "+" will result in an error, since @@ -1337,11 +1342,11 @@ ZEXTERN gzFile ZEXPORT gzopen OF((const char *path, const char *mode)); file could not be opened. */ -ZEXTERN gzFile ZEXPORT gzdopen OF((int fd, const char *mode)); +ZEXTERN gzFile ZEXPORT gzdopen(int fd, const char *mode); /* - gzdopen associates a gzFile with the file descriptor fd. File descriptors - are obtained from calls like open, dup, creat, pipe or fileno (if the file - has been previously opened with fopen). The mode parameter is as in gzopen. + Associate a gzFile with the file descriptor fd. File descriptors are + obtained from calls like open, dup, creat, pipe or fileno (if the file has + been previously opened with fopen). The mode parameter is as in gzopen. The next call of gzclose on the returned gzFile will also close the file descriptor fd, just like fclose(fdopen(fd, mode)) closes the file descriptor @@ -1360,15 +1365,15 @@ ZEXTERN gzFile ZEXPORT gzdopen OF((int fd, const char *mode)); will not detect if fd is invalid (unless fd is -1). */ -ZEXTERN int ZEXPORT gzbuffer OF((gzFile file, unsigned size)); +ZEXTERN int ZEXPORT gzbuffer(gzFile file, unsigned size); /* - Set the internal buffer size used by this library's functions. The - default buffer size is 8192 bytes. This function must be called after - gzopen() or gzdopen(), and before any other calls that read or write the - file. The buffer memory allocation is always deferred to the first read or - write. Three times that size in buffer space is allocated. A larger buffer - size of, for example, 64K or 128K bytes will noticeably increase the speed - of decompression (reading). + Set the internal buffer size used by this library's functions for file to + size. The default buffer size is 8192 bytes. This function must be called + after gzopen() or gzdopen(), and before any other calls that read or write + the file. The buffer memory allocation is always deferred to the first read + or write. Three times that size in buffer space is allocated. A larger + buffer size of, for example, 64K or 128K bytes will noticeably increase the + speed of decompression (reading). The new buffer size also affects the maximum length for gzprintf(). @@ -1376,20 +1381,20 @@ ZEXTERN int ZEXPORT gzbuffer OF((gzFile file, unsigned size)); too late. */ -ZEXTERN int ZEXPORT gzsetparams OF((gzFile file, int level, int strategy)); +ZEXTERN int ZEXPORT gzsetparams(gzFile file, int level, int strategy); /* - Dynamically update the compression level or strategy. See the description - of deflateInit2 for the meaning of these parameters. Previously provided - data is flushed before the parameter change. + Dynamically update the compression level and strategy for file. See the + description of deflateInit2 for the meaning of these parameters. Previously + provided data is flushed before applying the parameter changes. gzsetparams returns Z_OK if success, Z_STREAM_ERROR if the file was not opened for writing, Z_ERRNO if there is an error writing the flushed data, or Z_MEM_ERROR if there is a memory allocation error. */ -ZEXTERN int ZEXPORT gzread OF((gzFile file, voidp buf, unsigned len)); +ZEXTERN int ZEXPORT gzread(gzFile file, voidp buf, unsigned len); /* - Reads the given number of uncompressed bytes from the compressed file. If + Read and decompress up to len uncompressed bytes from file into buf. If the input file is not in gzip format, gzread copies the given number of bytes into the buffer directly from the file. @@ -1417,14 +1422,14 @@ ZEXTERN int ZEXPORT gzread OF((gzFile file, voidp buf, unsigned len)); Z_STREAM_ERROR. */ -ZEXTERN z_size_t ZEXPORT gzfread OF((voidp buf, z_size_t size, z_size_t nitems, - gzFile file)); +ZEXTERN z_size_t ZEXPORT gzfread(voidp buf, z_size_t size, z_size_t nitems, + gzFile file); /* - Read up to nitems items of size size from file to buf, otherwise operating - as gzread() does. This duplicates the interface of stdio's fread(), with - size_t request and return types. If the library defines size_t, then - z_size_t is identical to size_t. If not, then z_size_t is an unsigned - integer type that can contain a pointer. + Read and decompress up to nitems items of size size from file into buf, + otherwise operating as gzread() does. This duplicates the interface of + stdio's fread(), with size_t request and return types. If the library + defines size_t, then z_size_t is identical to size_t. If not, then z_size_t + is an unsigned integer type that can contain a pointer. gzfread() returns the number of full items read of size size, or zero if the end of the file was reached and a full item could not be read, or if @@ -1435,26 +1440,24 @@ ZEXTERN z_size_t ZEXPORT gzfread OF((voidp buf, z_size_t size, z_size_t nitems, In the event that the end of file is reached and only a partial item is available at the end, i.e. the remaining uncompressed data length is not a - multiple of size, then the final partial item is nevetheless read into buf + multiple of size, then the final partial item is nevertheless read into buf and the end-of-file flag is set. The length of the partial item read is not provided, but could be inferred from the result of gztell(). This behavior is the same as the behavior of fread() implementations in common libraries, but it prevents the direct use of gzfread() to read a concurrently written - file, reseting and retrying on end-of-file, when size is not 1. + file, resetting and retrying on end-of-file, when size is not 1. */ -ZEXTERN int ZEXPORT gzwrite OF((gzFile file, - voidpc buf, unsigned len)); +ZEXTERN int ZEXPORT gzwrite(gzFile file, voidpc buf, unsigned len); /* - Writes the given number of uncompressed bytes into the compressed file. - gzwrite returns the number of uncompressed bytes written or 0 in case of - error. + Compress and write the len uncompressed bytes at buf to file. gzwrite + returns the number of uncompressed bytes written or 0 in case of error. */ -ZEXTERN z_size_t ZEXPORT gzfwrite OF((voidpc buf, z_size_t size, - z_size_t nitems, gzFile file)); +ZEXTERN z_size_t ZEXPORT gzfwrite(voidpc buf, z_size_t size, + z_size_t nitems, gzFile file); /* - gzfwrite() writes nitems items of size size from buf to file, duplicating + Compress and write nitems items of size size from buf to file, duplicating the interface of stdio's fwrite(), with size_t request and return types. If the library defines size_t, then z_size_t is identical to size_t. If not, then z_size_t is an unsigned integer type that can contain a pointer. @@ -1465,61 +1468,62 @@ ZEXTERN z_size_t ZEXPORT gzfwrite OF((voidpc buf, z_size_t size, is returned, and the error state is set to Z_STREAM_ERROR. */ -ZEXTERN int ZEXPORTVA gzprintf Z_ARG((gzFile file, const char *format, ...)); +ZEXTERN int ZEXPORTVA gzprintf(gzFile file, const char *format, ...); /* - Converts, formats, and writes the arguments to the compressed file under - control of the format string, as in fprintf. gzprintf returns the number of + Convert, format, compress, and write the arguments (...) to file under + control of the string format, as in fprintf. gzprintf returns the number of uncompressed bytes actually written, or a negative zlib error code in case of error. The number of uncompressed bytes written is limited to 8191, or one less than the buffer size given to gzbuffer(). The caller should assure that this limit is not exceeded. If it is exceeded, then gzprintf() will return an error (0) with nothing written. In this case, there may also be a buffer overflow with unpredictable consequences, which is possible only if - zlib was compiled with the insecure functions sprintf() or vsprintf() + zlib was compiled with the insecure functions sprintf() or vsprintf(), because the secure snprintf() or vsnprintf() functions were not available. This can be determined using zlibCompileFlags(). */ -ZEXTERN int ZEXPORT gzputs OF((gzFile file, const char *s)); +ZEXTERN int ZEXPORT gzputs(gzFile file, const char *s); /* - Writes the given null-terminated string to the compressed file, excluding + Compress and write the given null-terminated string s to file, excluding the terminating null character. gzputs returns the number of characters written, or -1 in case of error. */ -ZEXTERN char * ZEXPORT gzgets OF((gzFile file, char *buf, int len)); +ZEXTERN char * ZEXPORT gzgets(gzFile file, char *buf, int len); /* - Reads bytes from the compressed file until len-1 characters are read, or a - newline character is read and transferred to buf, or an end-of-file - condition is encountered. If any characters are read or if len == 1, the - string is terminated with a null character. If no characters are read due - to an end-of-file or len < 1, then the buffer is left untouched. + Read and decompress bytes from file into buf, until len-1 characters are + read, or until a newline character is read and transferred to buf, or an + end-of-file condition is encountered. If any characters are read or if len + is one, the string is terminated with a null character. If no characters + are read due to an end-of-file or len is less than one, then the buffer is + left untouched. gzgets returns buf which is a null-terminated string, or it returns NULL for end-of-file or in case of error. If there was an error, the contents at buf are indeterminate. */ -ZEXTERN int ZEXPORT gzputc OF((gzFile file, int c)); +ZEXTERN int ZEXPORT gzputc(gzFile file, int c); /* - Writes c, converted to an unsigned char, into the compressed file. gzputc + Compress and write c, converted to an unsigned char, into file. gzputc returns the value that was written, or -1 in case of error. */ -ZEXTERN int ZEXPORT gzgetc OF((gzFile file)); +ZEXTERN int ZEXPORT gzgetc(gzFile file); /* - Reads one byte from the compressed file. gzgetc returns this byte or -1 + Read and decompress one byte from file. gzgetc returns this byte or -1 in case of end of file or error. This is implemented as a macro for speed. As such, it does not do all of the checking the other functions do. I.e. it does not check to see if file is NULL, nor whether the structure file points to has been clobbered or not. */ -ZEXTERN int ZEXPORT gzungetc OF((int c, gzFile file)); +ZEXTERN int ZEXPORT gzungetc(int c, gzFile file); /* - Push one character back onto the stream to be read as the first character - on the next read. At least one character of push-back is allowed. + Push c back onto the stream for file to be read as the first character on + the next read. At least one character of push-back is always allowed. gzungetc() returns the character pushed, or -1 on failure. gzungetc() will fail if c is -1, and may fail if a character has been pushed but not read yet. If gzungetc is used immediately after gzopen or gzdopen, at least the @@ -1528,11 +1532,11 @@ ZEXTERN int ZEXPORT gzungetc OF((int c, gzFile file)); gzseek() or gzrewind(). */ -ZEXTERN int ZEXPORT gzflush OF((gzFile file, int flush)); +ZEXTERN int ZEXPORT gzflush(gzFile file, int flush); /* - Flushes all pending output into the compressed file. The parameter flush - is as in the deflate() function. The return value is the zlib error number - (see function gzerror below). gzflush is only permitted when writing. + Flush all pending output to file. The parameter flush is as in the + deflate() function. The return value is the zlib error number (see function + gzerror below). gzflush is only permitted when writing. If the flush parameter is Z_FINISH, the remaining data is written and the gzip stream is completed in the output. If gzwrite() is called again, a new @@ -1544,11 +1548,11 @@ ZEXTERN int ZEXPORT gzflush OF((gzFile file, int flush)); */ /* -ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile file, - z_off_t offset, int whence)); +ZEXTERN z_off_t ZEXPORT gzseek(gzFile file, + z_off_t offset, int whence); - Sets the starting position for the next gzread or gzwrite on the given - compressed file. The offset represents a number of bytes in the + Set the starting position to offset relative to whence for the next gzread + or gzwrite on file. The offset represents a number of bytes in the uncompressed data stream. The whence parameter is defined as in lseek(2); the value SEEK_END is not supported. @@ -1563,52 +1567,52 @@ ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile file, would be before the current position. */ -ZEXTERN int ZEXPORT gzrewind OF((gzFile file)); +ZEXTERN int ZEXPORT gzrewind(gzFile file); /* - Rewinds the given file. This function is supported only for reading. + Rewind file. This function is supported only for reading. - gzrewind(file) is equivalent to (int)gzseek(file, 0L, SEEK_SET) + gzrewind(file) is equivalent to (int)gzseek(file, 0L, SEEK_SET). */ /* -ZEXTERN z_off_t ZEXPORT gztell OF((gzFile file)); +ZEXTERN z_off_t ZEXPORT gztell(gzFile file); - Returns the starting position for the next gzread or gzwrite on the given - compressed file. This position represents a number of bytes in the - uncompressed data stream, and is zero when starting, even if appending or - reading a gzip stream from the middle of a file using gzdopen(). + Return the starting position for the next gzread or gzwrite on file. + This position represents a number of bytes in the uncompressed data stream, + and is zero when starting, even if appending or reading a gzip stream from + the middle of a file using gzdopen(). gztell(file) is equivalent to gzseek(file, 0L, SEEK_CUR) */ /* -ZEXTERN z_off_t ZEXPORT gzoffset OF((gzFile file)); +ZEXTERN z_off_t ZEXPORT gzoffset(gzFile file); - Returns the current offset in the file being read or written. This offset - includes the count of bytes that precede the gzip stream, for example when - appending or when using gzdopen() for reading. When reading, the offset - does not include as yet unused buffered input. This information can be used - for a progress indicator. On error, gzoffset() returns -1. + Return the current compressed (actual) read or write offset of file. This + offset includes the count of bytes that precede the gzip stream, for example + when appending or when using gzdopen() for reading. When reading, the + offset does not include as yet unused buffered input. This information can + be used for a progress indicator. On error, gzoffset() returns -1. */ -ZEXTERN int ZEXPORT gzeof OF((gzFile file)); +ZEXTERN int ZEXPORT gzeof(gzFile file); /* - Returns true (1) if the end-of-file indicator has been set while reading, - false (0) otherwise. Note that the end-of-file indicator is set only if the - read tried to go past the end of the input, but came up short. Therefore, - just like feof(), gzeof() may return false even if there is no more data to - read, in the event that the last read request was for the exact number of - bytes remaining in the input file. This will happen if the input file size - is an exact multiple of the buffer size. + Return true (1) if the end-of-file indicator for file has been set while + reading, false (0) otherwise. Note that the end-of-file indicator is set + only if the read tried to go past the end of the input, but came up short. + Therefore, just like feof(), gzeof() may return false even if there is no + more data to read, in the event that the last read request was for the exact + number of bytes remaining in the input file. This will happen if the input + file size is an exact multiple of the buffer size. If gzeof() returns true, then the read functions will return no more data, unless the end-of-file indicator is reset by gzclearerr() and the input file has grown since the previous end of file was detected. */ -ZEXTERN int ZEXPORT gzdirect OF((gzFile file)); +ZEXTERN int ZEXPORT gzdirect(gzFile file); /* - Returns true (1) if file is being copied directly while reading, or false + Return true (1) if file is being copied directly while reading, or false (0) if file is a gzip stream being decompressed. If the input file is empty, gzdirect() will return true, since the input @@ -1627,10 +1631,10 @@ ZEXTERN int ZEXPORT gzdirect OF((gzFile file)); gzip file reading and decompression, which may not be desired.) */ -ZEXTERN int ZEXPORT gzclose OF((gzFile file)); +ZEXTERN int ZEXPORT gzclose(gzFile file); /* - Flushes all pending output if necessary, closes the compressed file and - deallocates the (de)compression state. Note that once file is closed, you + Flush all pending output for file, if necessary, close file and + deallocate the (de)compression state. Note that once file is closed, you cannot call gzerror with file, since its structures have been deallocated. gzclose must not be called more than once on the same file, just as free must not be called more than once on the same allocation. @@ -1640,8 +1644,8 @@ ZEXTERN int ZEXPORT gzclose OF((gzFile file)); last read ended in the middle of a gzip stream, or Z_OK on success. */ -ZEXTERN int ZEXPORT gzclose_r OF((gzFile file)); -ZEXTERN int ZEXPORT gzclose_w OF((gzFile file)); +ZEXTERN int ZEXPORT gzclose_r(gzFile file); +ZEXTERN int ZEXPORT gzclose_w(gzFile file); /* Same as gzclose(), but gzclose_r() is only for use when reading, and gzclose_w() is only for use when writing or appending. The advantage to @@ -1652,12 +1656,12 @@ ZEXTERN int ZEXPORT gzclose_w OF((gzFile file)); zlib library. */ -ZEXTERN const char * ZEXPORT gzerror OF((gzFile file, int *errnum)); +ZEXTERN const char * ZEXPORT gzerror(gzFile file, int *errnum); /* - Returns the error message for the last error which occurred on the given - compressed file. errnum is set to zlib error number. If an error occurred - in the file system and not in the compression library, errnum is set to - Z_ERRNO and the application may consult errno to get the exact error code. + Return the error message for the last error which occurred on file. + errnum is set to zlib error number. If an error occurred in the file system + and not in the compression library, errnum is set to Z_ERRNO and the + application may consult errno to get the exact error code. The application must not modify the returned string. Future calls to this function may invalidate the previously returned string. If file is @@ -1668,9 +1672,9 @@ ZEXTERN const char * ZEXPORT gzerror OF((gzFile file, int *errnum)); functions above that do not distinguish those cases in their return values. */ -ZEXTERN void ZEXPORT gzclearerr OF((gzFile file)); +ZEXTERN void ZEXPORT gzclearerr(gzFile file); /* - Clears the error and end-of-file flags for file. This is analogous to the + Clear the error and end-of-file flags for file. This is analogous to the clearerr() function in stdio. This is useful for continuing to read a gzip file that is being written concurrently. */ @@ -1685,11 +1689,12 @@ ZEXTERN void ZEXPORT gzclearerr OF((gzFile file)); library. */ -ZEXTERN uLong ZEXPORT adler32 OF((uLong adler, const Bytef *buf, uInt len)); +ZEXTERN uLong ZEXPORT adler32(uLong adler, const Bytef *buf, uInt len); /* Update a running Adler-32 checksum with the bytes buf[0..len-1] and - return the updated checksum. If buf is Z_NULL, this function returns the - required initial value for the checksum. + return the updated checksum. An Adler-32 value is in the range of a 32-bit + unsigned integer. If buf is Z_NULL, this function returns the required + initial value for the checksum. An Adler-32 checksum is almost as reliable as a CRC-32 but can be computed much faster. @@ -1704,15 +1709,15 @@ ZEXTERN uLong ZEXPORT adler32 OF((uLong adler, const Bytef *buf, uInt len)); if (adler != original_adler) error(); */ -ZEXTERN uLong ZEXPORT adler32_z OF((uLong adler, const Bytef *buf, - z_size_t len)); +ZEXTERN uLong ZEXPORT adler32_z(uLong adler, const Bytef *buf, + z_size_t len); /* Same as adler32(), but with a size_t length. */ /* -ZEXTERN uLong ZEXPORT adler32_combine OF((uLong adler1, uLong adler2, - z_off_t len2)); +ZEXTERN uLong ZEXPORT adler32_combine(uLong adler1, uLong adler2, + z_off_t len2); Combine two Adler-32 checksums into one. For two sequences of bytes, seq1 and seq2 with lengths len1 and len2, Adler-32 checksums were calculated for @@ -1722,12 +1727,13 @@ ZEXTERN uLong ZEXPORT adler32_combine OF((uLong adler1, uLong adler2, negative, the result has no meaning or utility. */ -ZEXTERN uLong ZEXPORT crc32 OF((uLong crc, const Bytef *buf, uInt len)); +ZEXTERN uLong ZEXPORT crc32(uLong crc, const Bytef *buf, uInt len); /* Update a running CRC-32 with the bytes buf[0..len-1] and return the - updated CRC-32. If buf is Z_NULL, this function returns the required - initial value for the crc. Pre- and post-conditioning (one's complement) is - performed within this function so it shouldn't be done by the application. + updated CRC-32. A CRC-32 value is in the range of a 32-bit unsigned integer. + If buf is Z_NULL, this function returns the required initial value for the + crc. Pre- and post-conditioning (one's complement) is performed within this + function so it shouldn't be done by the application. Usage example: @@ -1739,20 +1745,34 @@ ZEXTERN uLong ZEXPORT crc32 OF((uLong crc, const Bytef *buf, uInt len)); if (crc != original_crc) error(); */ -ZEXTERN uLong ZEXPORT crc32_z OF((uLong adler, const Bytef *buf, - z_size_t len)); +ZEXTERN uLong ZEXPORT crc32_z(uLong crc, const Bytef *buf, + z_size_t len); /* Same as crc32(), but with a size_t length. */ /* -ZEXTERN uLong ZEXPORT crc32_combine OF((uLong crc1, uLong crc2, z_off_t len2)); +ZEXTERN uLong ZEXPORT crc32_combine(uLong crc1, uLong crc2, z_off_t len2); Combine two CRC-32 check values into one. For two sequences of bytes, seq1 and seq2 with lengths len1 and len2, CRC-32 check values were calculated for each, crc1 and crc2. crc32_combine() returns the CRC-32 check value of seq1 and seq2 concatenated, requiring only crc1, crc2, and - len2. + len2. len2 must be non-negative. +*/ + +/* +ZEXTERN uLong ZEXPORT crc32_combine_gen(z_off_t len2); + + Return the operator corresponding to length len2, to be used with + crc32_combine_op(). len2 must be non-negative. +*/ + +ZEXTERN uLong ZEXPORT crc32_combine_op(uLong crc1, uLong crc2, uLong op); +/* + Give the same result as crc32_combine(), using op in place of len2. op is + is generated from len2 by crc32_combine_gen(). This will be faster than + crc32_combine() if the generated op is used more than once. */ @@ -1761,20 +1781,20 @@ ZEXTERN uLong ZEXPORT crc32_combine OF((uLong crc1, uLong crc2, z_off_t len2)); /* deflateInit and inflateInit are macros to allow checking the zlib version * and the compiler's view of z_stream: */ -ZEXTERN int ZEXPORT deflateInit_ OF((z_streamp strm, int level, - const char *version, int stream_size)); -ZEXTERN int ZEXPORT inflateInit_ OF((z_streamp strm, - const char *version, int stream_size)); -ZEXTERN int ZEXPORT deflateInit2_ OF((z_streamp strm, int level, int method, - int windowBits, int memLevel, - int strategy, const char *version, - int stream_size)); -ZEXTERN int ZEXPORT inflateInit2_ OF((z_streamp strm, int windowBits, - const char *version, int stream_size)); -ZEXTERN int ZEXPORT inflateBackInit_ OF((z_streamp strm, int windowBits, - unsigned char FAR *window, - const char *version, - int stream_size)); +ZEXTERN int ZEXPORT deflateInit_(z_streamp strm, int level, + const char *version, int stream_size); +ZEXTERN int ZEXPORT inflateInit_(z_streamp strm, + const char *version, int stream_size); +ZEXTERN int ZEXPORT deflateInit2_(z_streamp strm, int level, int method, + int windowBits, int memLevel, + int strategy, const char *version, + int stream_size); +ZEXTERN int ZEXPORT inflateInit2_(z_streamp strm, int windowBits, + const char *version, int stream_size); +ZEXTERN int ZEXPORT inflateBackInit_(z_streamp strm, int windowBits, + unsigned char FAR *window, + const char *version, + int stream_size); #ifdef Z_PREFIX_SET # define z_deflateInit(strm, level) \ deflateInit_((strm), (level), ZLIB_VERSION, (int)sizeof(z_stream)) @@ -1819,7 +1839,7 @@ struct gzFile_s { unsigned char *next; z_off64_t pos; }; -ZEXTERN int ZEXPORT gzgetc_ OF((gzFile file)); /* backward compatibility */ +ZEXTERN int ZEXPORT gzgetc_(gzFile file); /* backward compatibility */ #ifdef Z_PREFIX_SET # undef z_gzgetc # define z_gzgetc(g) \ @@ -1836,12 +1856,13 @@ ZEXTERN int ZEXPORT gzgetc_ OF((gzFile file)); /* backward compatibility */ * without large file support, _LFS64_LARGEFILE must also be true */ #ifdef Z_LARGE64 - ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *)); - ZEXTERN z_off64_t ZEXPORT gzseek64 OF((gzFile, z_off64_t, int)); - ZEXTERN z_off64_t ZEXPORT gztell64 OF((gzFile)); - ZEXTERN z_off64_t ZEXPORT gzoffset64 OF((gzFile)); - ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off64_t)); - ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off64_t)); + ZEXTERN gzFile ZEXPORT gzopen64(const char *, const char *); + ZEXTERN z_off64_t ZEXPORT gzseek64(gzFile, z_off64_t, int); + ZEXTERN z_off64_t ZEXPORT gztell64(gzFile); + ZEXTERN z_off64_t ZEXPORT gzoffset64(gzFile); + ZEXTERN uLong ZEXPORT adler32_combine64(uLong, uLong, z_off64_t); + ZEXTERN uLong ZEXPORT crc32_combine64(uLong, uLong, z_off64_t); + ZEXTERN uLong ZEXPORT crc32_combine_gen64(z_off64_t); #endif #if !defined(ZLIB_INTERNAL) && defined(Z_WANT64) @@ -1852,6 +1873,7 @@ ZEXTERN int ZEXPORT gzgetc_ OF((gzFile file)); /* backward compatibility */ # define z_gzoffset z_gzoffset64 # define z_adler32_combine z_adler32_combine64 # define z_crc32_combine z_crc32_combine64 +# define z_crc32_combine_gen z_crc32_combine_gen64 # else # define gzopen gzopen64 # define gzseek gzseek64 @@ -1859,49 +1881,53 @@ ZEXTERN int ZEXPORT gzgetc_ OF((gzFile file)); /* backward compatibility */ # define gzoffset gzoffset64 # define adler32_combine adler32_combine64 # define crc32_combine crc32_combine64 +# define crc32_combine_gen crc32_combine_gen64 # endif # ifndef Z_LARGE64 - ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *)); - ZEXTERN z_off_t ZEXPORT gzseek64 OF((gzFile, z_off_t, int)); - ZEXTERN z_off_t ZEXPORT gztell64 OF((gzFile)); - ZEXTERN z_off_t ZEXPORT gzoffset64 OF((gzFile)); - ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off_t)); - ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off_t)); + ZEXTERN gzFile ZEXPORT gzopen64(const char *, const char *); + ZEXTERN z_off_t ZEXPORT gzseek64(gzFile, z_off_t, int); + ZEXTERN z_off_t ZEXPORT gztell64(gzFile); + ZEXTERN z_off_t ZEXPORT gzoffset64(gzFile); + ZEXTERN uLong ZEXPORT adler32_combine64(uLong, uLong, z_off_t); + ZEXTERN uLong ZEXPORT crc32_combine64(uLong, uLong, z_off_t); + ZEXTERN uLong ZEXPORT crc32_combine_gen64(z_off_t); # endif #else - ZEXTERN gzFile ZEXPORT gzopen OF((const char *, const char *)); - ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile, z_off_t, int)); - ZEXTERN z_off_t ZEXPORT gztell OF((gzFile)); - ZEXTERN z_off_t ZEXPORT gzoffset OF((gzFile)); - ZEXTERN uLong ZEXPORT adler32_combine OF((uLong, uLong, z_off_t)); - ZEXTERN uLong ZEXPORT crc32_combine OF((uLong, uLong, z_off_t)); + ZEXTERN gzFile ZEXPORT gzopen(const char *, const char *); + ZEXTERN z_off_t ZEXPORT gzseek(gzFile, z_off_t, int); + ZEXTERN z_off_t ZEXPORT gztell(gzFile); + ZEXTERN z_off_t ZEXPORT gzoffset(gzFile); + ZEXTERN uLong ZEXPORT adler32_combine(uLong, uLong, z_off_t); + ZEXTERN uLong ZEXPORT crc32_combine(uLong, uLong, z_off_t); + ZEXTERN uLong ZEXPORT crc32_combine_gen(z_off_t); #endif #else /* Z_SOLO */ - ZEXTERN uLong ZEXPORT adler32_combine OF((uLong, uLong, z_off_t)); - ZEXTERN uLong ZEXPORT crc32_combine OF((uLong, uLong, z_off_t)); + ZEXTERN uLong ZEXPORT adler32_combine(uLong, uLong, z_off_t); + ZEXTERN uLong ZEXPORT crc32_combine(uLong, uLong, z_off_t); + ZEXTERN uLong ZEXPORT crc32_combine_gen(z_off_t); #endif /* !Z_SOLO */ /* undocumented functions */ -ZEXTERN const char * ZEXPORT zError OF((int)); -ZEXTERN int ZEXPORT inflateSyncPoint OF((z_streamp)); -ZEXTERN const z_crc_t FAR * ZEXPORT get_crc_table OF((void)); -ZEXTERN int ZEXPORT inflateUndermine OF((z_streamp, int)); -ZEXTERN int ZEXPORT inflateValidate OF((z_streamp, int)); -ZEXTERN unsigned long ZEXPORT inflateCodesUsed OF ((z_streamp)); -ZEXTERN int ZEXPORT inflateResetKeep OF((z_streamp)); -ZEXTERN int ZEXPORT deflateResetKeep OF((z_streamp)); +ZEXTERN const char * ZEXPORT zError(int); +ZEXTERN int ZEXPORT inflateSyncPoint(z_streamp); +ZEXTERN const z_crc_t FAR * ZEXPORT get_crc_table(void); +ZEXTERN int ZEXPORT inflateUndermine(z_streamp, int); +ZEXTERN int ZEXPORT inflateValidate(z_streamp, int); +ZEXTERN unsigned long ZEXPORT inflateCodesUsed(z_streamp); +ZEXTERN int ZEXPORT inflateResetKeep(z_streamp); +ZEXTERN int ZEXPORT deflateResetKeep(z_streamp); #if defined(_WIN32) && !defined(Z_SOLO) -ZEXTERN gzFile ZEXPORT gzopen_w OF((const wchar_t *path, - const char *mode)); +ZEXTERN gzFile ZEXPORT gzopen_w(const wchar_t *path, + const char *mode); #endif #if defined(STDC) || defined(Z_HAVE_STDARG_H) # ifndef Z_SOLO -ZEXTERN int ZEXPORTVA gzvprintf Z_ARG((gzFile file, - const char *format, - va_list va)); +ZEXTERN int ZEXPORTVA gzvprintf(gzFile file, + const char *format, + va_list va); # endif #endif diff --git a/zlib/zlib.map b/zlib/zlib.map index 40fa9db2bce3..31544f2e93da 100644 --- a/zlib/zlib.map +++ b/zlib/zlib.map @@ -1,94 +1,100 @@ -ZLIB_1.2.0 { - global: - compressBound; - deflateBound; - inflateBack; - inflateBackEnd; - inflateBackInit_; - inflateCopy; - local: - deflate_copyright; - inflate_copyright; - inflate_fast; - inflate_table; - zcalloc; - zcfree; - z_errmsg; - gz_error; - gz_intmax; - _*; -}; - -ZLIB_1.2.0.2 { - gzclearerr; - gzungetc; - zlibCompileFlags; -} ZLIB_1.2.0; - -ZLIB_1.2.0.8 { - deflatePrime; -} ZLIB_1.2.0.2; - -ZLIB_1.2.2 { - adler32_combine; - crc32_combine; - deflateSetHeader; - inflateGetHeader; -} ZLIB_1.2.0.8; - -ZLIB_1.2.2.3 { - deflateTune; - gzdirect; -} ZLIB_1.2.2; - -ZLIB_1.2.2.4 { - inflatePrime; -} ZLIB_1.2.2.3; - -ZLIB_1.2.3.3 { - adler32_combine64; - crc32_combine64; - gzopen64; - gzseek64; - gztell64; - inflateUndermine; -} ZLIB_1.2.2.4; - -ZLIB_1.2.3.4 { - inflateReset2; - inflateMark; -} ZLIB_1.2.3.3; - -ZLIB_1.2.3.5 { - gzbuffer; - gzoffset; - gzoffset64; - gzclose_r; - gzclose_w; -} ZLIB_1.2.3.4; - -ZLIB_1.2.5.1 { - deflatePending; -} ZLIB_1.2.3.5; - -ZLIB_1.2.5.2 { - deflateResetKeep; - gzgetc_; - inflateResetKeep; -} ZLIB_1.2.5.1; - -ZLIB_1.2.7.1 { - inflateGetDictionary; - gzvprintf; -} ZLIB_1.2.5.2; - -ZLIB_1.2.9 { - inflateCodesUsed; - inflateValidate; - uncompress2; - gzfread; - gzfwrite; - deflateGetDictionary; - adler32_z; - crc32_z; -} ZLIB_1.2.7.1; +ZLIB_1.2.0 { + global: + compressBound; + deflateBound; + inflateBack; + inflateBackEnd; + inflateBackInit_; + inflateCopy; + local: + deflate_copyright; + inflate_copyright; + inflate_fast; + inflate_table; + zcalloc; + zcfree; + z_errmsg; + gz_error; + gz_intmax; + _*; +}; + +ZLIB_1.2.0.2 { + gzclearerr; + gzungetc; + zlibCompileFlags; +} ZLIB_1.2.0; + +ZLIB_1.2.0.8 { + deflatePrime; +} ZLIB_1.2.0.2; + +ZLIB_1.2.2 { + adler32_combine; + crc32_combine; + deflateSetHeader; + inflateGetHeader; +} ZLIB_1.2.0.8; + +ZLIB_1.2.2.3 { + deflateTune; + gzdirect; +} ZLIB_1.2.2; + +ZLIB_1.2.2.4 { + inflatePrime; +} ZLIB_1.2.2.3; + +ZLIB_1.2.3.3 { + adler32_combine64; + crc32_combine64; + gzopen64; + gzseek64; + gztell64; + inflateUndermine; +} ZLIB_1.2.2.4; + +ZLIB_1.2.3.4 { + inflateReset2; + inflateMark; +} ZLIB_1.2.3.3; + +ZLIB_1.2.3.5 { + gzbuffer; + gzoffset; + gzoffset64; + gzclose_r; + gzclose_w; +} ZLIB_1.2.3.4; + +ZLIB_1.2.5.1 { + deflatePending; +} ZLIB_1.2.3.5; + +ZLIB_1.2.5.2 { + deflateResetKeep; + gzgetc_; + inflateResetKeep; +} ZLIB_1.2.5.1; + +ZLIB_1.2.7.1 { + inflateGetDictionary; + gzvprintf; +} ZLIB_1.2.5.2; + +ZLIB_1.2.9 { + inflateCodesUsed; + inflateValidate; + uncompress2; + gzfread; + gzfwrite; + deflateGetDictionary; + adler32_z; + crc32_z; +} ZLIB_1.2.7.1; + +ZLIB_1.2.12 { + crc32_combine_gen; + crc32_combine_gen64; + crc32_combine_op; +} ZLIB_1.2.9; diff --git a/zlib/zutil.c b/zlib/zutil.c index 08787c6f5d58..b1c5d2d3c6da 100644 --- a/zlib/zutil.c +++ b/zlib/zutil.c @@ -3,7 +3,7 @@ * For conditions of distribution and use, see copyright notice in zlib.h */ -/* @(#) $Id: zutil.c,v 1.1.1.2 2002/03/11 21:53:27 tromey Exp $ */ +/* @(#) $Id$ */ #include "zutil.h" #ifndef Z_SOLO @@ -24,13 +24,11 @@ z_const char * const z_errmsg[10] = { }; -const char * ZEXPORT zlibVersion() -{ +const char * ZEXPORT zlibVersion(void) { return ZLIB_VERSION; } -uLong ZEXPORT zlibCompileFlags() -{ +uLong ZEXPORT zlibCompileFlags(void) { uLong flags; flags = 0; @@ -61,9 +59,11 @@ uLong ZEXPORT zlibCompileFlags() #ifdef ZLIB_DEBUG flags += 1 << 8; #endif + /* #if defined(ASMV) || defined(ASMINF) flags += 1 << 9; #endif + */ #ifdef ZLIB_WINAPI flags += 1 << 10; #endif @@ -119,9 +119,7 @@ uLong ZEXPORT zlibCompileFlags() # endif int ZLIB_INTERNAL z_verbose = verbose; -void ZLIB_INTERNAL z_error (m) - char *m; -{ +void ZLIB_INTERNAL z_error(char *m) { fprintf(stderr, "%s\n", m); exit(1); } @@ -130,14 +128,12 @@ void ZLIB_INTERNAL z_error (m) /* exported to allow conversion of error code to string for compress() and * uncompress() */ -const char * ZEXPORT zError(err) - int err; -{ +const char * ZEXPORT zError(int err) { return ERR_MSG(err); } -#if defined(_WIN32_WCE) - /* The Microsoft C Run-Time Library for Windows CE doesn't have +#if defined(_WIN32_WCE) && _WIN32_WCE < 0x800 + /* The older Microsoft C Run-Time Library for Windows CE doesn't have * errno. We define it as a global variable to simplify porting. * Its value is always 0 and should not be used. */ @@ -146,22 +142,14 @@ const char * ZEXPORT zError(err) #ifndef HAVE_MEMCPY -void ZLIB_INTERNAL zmemcpy(dest, source, len) - Bytef* dest; - const Bytef* source; - uInt len; -{ +void ZLIB_INTERNAL zmemcpy(Bytef* dest, const Bytef* source, uInt len) { if (len == 0) return; do { *dest++ = *source++; /* ??? to be unrolled */ } while (--len != 0); } -int ZLIB_INTERNAL zmemcmp(s1, s2, len) - const Bytef* s1; - const Bytef* s2; - uInt len; -{ +int ZLIB_INTERNAL zmemcmp(const Bytef* s1, const Bytef* s2, uInt len) { uInt j; for (j = 0; j < len; j++) { @@ -170,10 +158,7 @@ int ZLIB_INTERNAL zmemcmp(s1, s2, len) return 0; } -void ZLIB_INTERNAL zmemzero(dest, len) - Bytef* dest; - uInt len; -{ +void ZLIB_INTERNAL zmemzero(Bytef* dest, uInt len) { if (len == 0) return; do { *dest++ = 0; /* ??? to be unrolled */ @@ -214,8 +199,7 @@ local ptr_table table[MAX_PTR]; * a protected system like OS/2. Use Microsoft C instead. */ -voidpf ZLIB_INTERNAL zcalloc (voidpf opaque, unsigned items, unsigned size) -{ +voidpf ZLIB_INTERNAL zcalloc(voidpf opaque, unsigned items, unsigned size) { voidpf buf; ulg bsize = (ulg)items*size; @@ -240,8 +224,7 @@ voidpf ZLIB_INTERNAL zcalloc (voidpf opaque, unsigned items, unsigned size) return buf; } -void ZLIB_INTERNAL zcfree (voidpf opaque, voidpf ptr) -{ +void ZLIB_INTERNAL zcfree(voidpf opaque, voidpf ptr) { int n; (void)opaque; @@ -277,14 +260,12 @@ void ZLIB_INTERNAL zcfree (voidpf opaque, voidpf ptr) # define _hfree hfree #endif -voidpf ZLIB_INTERNAL zcalloc (voidpf opaque, uInt items, uInt size) -{ +voidpf ZLIB_INTERNAL zcalloc(voidpf opaque, uInt items, uInt size) { (void)opaque; return _halloc((long)items, size); } -void ZLIB_INTERNAL zcfree (voidpf opaque, voidpf ptr) -{ +void ZLIB_INTERNAL zcfree(voidpf opaque, voidpf ptr) { (void)opaque; _hfree(ptr); } @@ -297,25 +278,18 @@ void ZLIB_INTERNAL zcfree (voidpf opaque, voidpf ptr) #ifndef MY_ZCALLOC /* Any system without a special alloc function */ #ifndef STDC -extern voidp malloc OF((uInt size)); -extern voidp calloc OF((uInt items, uInt size)); -extern void free OF((voidpf ptr)); +extern voidp malloc(uInt size); +extern voidp calloc(uInt items, uInt size); +extern void free(voidpf ptr); #endif -voidpf ZLIB_INTERNAL zcalloc (opaque, items, size) - voidpf opaque; - unsigned items; - unsigned size; -{ +voidpf ZLIB_INTERNAL zcalloc(voidpf opaque, unsigned items, unsigned size) { (void)opaque; return sizeof(uInt) > 2 ? (voidpf)malloc(items * size) : (voidpf)calloc(items, size); } -void ZLIB_INTERNAL zcfree (opaque, ptr) - voidpf opaque; - voidpf ptr; -{ +void ZLIB_INTERNAL zcfree(voidpf opaque, voidpf ptr) { (void)opaque; free(ptr); } diff --git a/zlib/zutil.h b/zlib/zutil.h index 4b596adf6295..48dd7febae65 100644 --- a/zlib/zutil.h +++ b/zlib/zutil.h @@ -1,5 +1,5 @@ /* zutil.h -- internal interface and configuration of the compression library - * Copyright (C) 1995-2016 Jean-loup Gailly, Mark Adler + * Copyright (C) 1995-2024 Jean-loup Gailly, Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -8,7 +8,7 @@ subject to change. Applications should only use zlib.h. */ -/* @(#) $Id: zutil.h,v 1.1.1.2 2002/03/11 21:53:28 tromey Exp $ */ +/* @(#) $Id$ */ #ifndef ZUTIL_H #define ZUTIL_H @@ -29,10 +29,6 @@ # include #endif -#ifdef Z_SOLO - typedef long ptrdiff_t; /* guess -- will be caught if guess is wrong */ -#endif - #ifndef local # define local static #endif @@ -46,10 +42,21 @@ typedef unsigned short ush; typedef ush FAR ushf; typedef unsigned long ulg; +#if !defined(Z_U8) && !defined(Z_SOLO) && defined(STDC) +# include +# if (ULONG_MAX == 0xffffffffffffffff) +# define Z_U8 unsigned long +# elif (ULLONG_MAX == 0xffffffffffffffff) +# define Z_U8 unsigned long long +# elif (UINT_MAX == 0xffffffffffffffff) +# define Z_U8 unsigned +# endif +#endif + extern z_const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ /* (size given to avoid silly warnings with Visual C++) */ -#define ERR_MSG(err) z_errmsg[Z_NEED_DICT-(err)] +#define ERR_MSG(err) z_errmsg[(err) < -6 || (err) > 2 ? 9 : 2 - (err)] #define ERR_RETURN(strm,err) \ return (strm->msg = ERR_MSG(err), (err)) @@ -130,17 +137,8 @@ extern z_const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ # endif #endif -#if defined(MACOS) || defined(TARGET_OS_MAC) +#if defined(MACOS) # define OS_CODE 7 -# ifndef Z_SOLO -# if defined(__MWERKS__) && __dest_os != __be_os && __dest_os != __win32_os -# include /* for fdopen */ -# else -# ifndef fdopen -# define fdopen(fd,mode) NULL /* No fdopen() */ -# endif -# endif -# endif #endif #ifdef __acorn @@ -163,22 +161,6 @@ extern z_const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ # define OS_CODE 19 #endif -#if defined(_BEOS_) || defined(RISCOS) -# define fdopen(fd,mode) NULL /* No fdopen() */ -#endif - -#if (defined(_MSC_VER) && (_MSC_VER > 600)) && !defined __INTERIX -# if defined(_WIN32_WCE) -# define fdopen(fd,mode) NULL /* No fdopen() */ -# ifndef _PTRDIFF_T_DEFINED - typedef int ptrdiff_t; -# define _PTRDIFF_T_DEFINED -# endif -# else -# define fdopen(fd,type) _fdopen(fd,type) -# endif -#endif - #if defined(__BORLANDC__) && !defined(MSDOS) #pragma warn -8004 #pragma warn -8008 @@ -188,8 +170,9 @@ extern z_const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ /* provide prototypes for these when building zlib without LFS */ #if !defined(_WIN32) && \ (!defined(_LARGEFILE64_SOURCE) || _LFS64_LARGEFILE-0 == 0) - ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off_t)); - ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off_t)); + ZEXTERN uLong ZEXPORT adler32_combine64(uLong, uLong, z_off_t); + ZEXTERN uLong ZEXPORT crc32_combine64(uLong, uLong, z_off_t); + ZEXTERN uLong ZEXPORT crc32_combine_gen64(z_off_t); #endif /* common defaults */ @@ -228,16 +211,16 @@ extern z_const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ # define zmemzero(dest, len) memset(dest, 0, len) # endif #else - void ZLIB_INTERNAL zmemcpy OF((Bytef* dest, const Bytef* source, uInt len)); - int ZLIB_INTERNAL zmemcmp OF((const Bytef* s1, const Bytef* s2, uInt len)); - void ZLIB_INTERNAL zmemzero OF((Bytef* dest, uInt len)); + void ZLIB_INTERNAL zmemcpy(Bytef* dest, const Bytef* source, uInt len); + int ZLIB_INTERNAL zmemcmp(const Bytef* s1, const Bytef* s2, uInt len); + void ZLIB_INTERNAL zmemzero(Bytef* dest, uInt len); #endif /* Diagnostic functions */ #ifdef ZLIB_DEBUG # include extern int ZLIB_INTERNAL z_verbose; - extern void ZLIB_INTERNAL z_error OF((char *m)); + extern void ZLIB_INTERNAL z_error(char *m); # define Assert(cond,msg) {if(!(cond)) z_error(msg);} # define Trace(x) {if (z_verbose>=0) fprintf x ;} # define Tracev(x) {if (z_verbose>0) fprintf x ;} @@ -254,9 +237,9 @@ extern z_const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ #endif #ifndef Z_SOLO - voidpf ZLIB_INTERNAL zcalloc OF((voidpf opaque, unsigned items, - unsigned size)); - void ZLIB_INTERNAL zcfree OF((voidpf opaque, voidpf ptr)); + voidpf ZLIB_INTERNAL zcalloc(voidpf opaque, unsigned items, + unsigned size); + void ZLIB_INTERNAL zcfree(voidpf opaque, voidpf ptr); #endif #define ZALLOC(strm, items, size) \ -- 2.47.3