summaryrefslogtreecommitdiff
path: root/Userland/Libraries/LibAudio
diff options
context:
space:
mode:
authorArne Elster <arne@elster.li>2021-12-06 23:06:59 +0100
committerAndreas Kling <kling@serenityos.org>2022-02-26 16:01:26 +0100
commita4ba781f23df57af6bdfa3a30d64e9a9aeb0a4d7 (patch)
treef0d1ab7bbcd38228994cfe780b64d432ad8ebbd3 /Userland/Libraries/LibAudio
parentb7110c2a3446ec745b90d3cd6b6b3f8fc1bc1f86 (diff)
downloadserenity-a4ba781f23df57af6bdfa3a30d64e9a9aeb0a4d7.zip
LibAudio: Add huffman tables for MPEG-1 layer 3 audio
The data is taken straight from the ISO/IEC 11172-3 standard. For decoding efficiency the tables are transformed into trees at compile time using a constexpr approach. That way no runtime initialization is necessary and decoding can be faster than searching through tables.
Diffstat (limited to 'Userland/Libraries/LibAudio')
-rw-r--r--Userland/Libraries/LibAudio/MP3HuffmanTables.h1723
1 files changed, 1723 insertions, 0 deletions
diff --git a/Userland/Libraries/LibAudio/MP3HuffmanTables.h b/Userland/Libraries/LibAudio/MP3HuffmanTables.h
new file mode 100644
index 0000000000..e07a91eabb
--- /dev/null
+++ b/Userland/Libraries/LibAudio/MP3HuffmanTables.h
@@ -0,0 +1,1723 @@
+/*
+ * Copyright (c) 2021, the SerenityOS developers.
+ * Copyright (c) 2021, Arne Elster <arne@elster.li>
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+
+#pragma once
+
+#include <AK/Array.h>
+#include <AK/BitStream.h>
+#include <AK/Span.h>
+
+namespace Audio::MP3::Tables::Huffman {
+
+template<typename Symbol>
+struct HuffmanEntry {
+ using SymbolType = Symbol;
+ unsigned code;
+ size_t code_length;
+ Symbol symbol;
+};
+
+template<typename Symbol>
+struct HuffmanNode {
+ int left;
+ int right;
+ unsigned code;
+ size_t code_length;
+ Symbol symbol;
+ bool is_leaf() const { return left == -1 && right == -1; }
+};
+
+template<typename Symbol, size_t Size>
+using HuffmanEntries = Array<Symbol, Size>;
+
+template<typename Symbol, size_t Size>
+using HuffmanNodes = Array<HuffmanNode<Symbol>, Size>;
+
+template<typename Symbol, size_t Size>
+consteval size_t length_of_longest_huffman_code(HuffmanEntries<Symbol, Size> const& table)
+{
+ size_t max = 0;
+ for (size_t i = 0; i < table.size(); i++) {
+ if (table[i].code_length > max)
+ max = table[i].code_length;
+ }
+ return max;
+}
+
+template<typename Symbol, typename NodeArrayType>
+consteval int make_huffman_tree_internal(auto const& table, NodeArrayType&& nodes)
+{
+ size_t allocation_count = 1;
+
+ nodes = {};
+ nodes[0].left = nodes[0].right = -1;
+
+ for (size_t i = 0; i < table.size(); i++) {
+ HuffmanEntry<Symbol> const& entry = table[i];
+ int tree_pointer = 0;
+
+ for (size_t j = 0; j < entry.code_length; j++) {
+ bool const bit = (entry.code >> (entry.code_length - j - 1)) & 1;
+ bool const end_of_code = j == entry.code_length - 1;
+
+ int& target_index = bit ? nodes[tree_pointer].left : nodes[tree_pointer].right;
+
+ if (target_index != -1) {
+ if (end_of_code)
+ return -1;
+ tree_pointer = target_index;
+ } else {
+ tree_pointer = target_index = allocation_count++;
+ nodes[target_index].left = nodes[target_index].right = -1;
+ nodes[target_index].code_length = j + 1;
+ if (end_of_code) {
+ nodes[target_index].symbol = entry.symbol;
+ nodes[target_index].code = entry.code;
+ }
+ }
+ }
+ }
+
+ return allocation_count;
+}
+
+template<auto table>
+consteval auto make_huffman_tree()
+{
+ using Symbol = typename decltype(table)::ValueType::SymbolType;
+ constexpr size_t size_worst_case = 1 << (length_of_longest_huffman_code(table) + 1);
+ constexpr int size_fitted = make_huffman_tree_internal<Symbol>(table, HuffmanNodes<Symbol, size_worst_case>());
+ static_assert(size_fitted >= 0, "Huffman tree is ill-formed");
+
+ HuffmanNodes<Symbol, size_fitted> nodes;
+ make_huffman_tree_internal<Symbol>(table, nodes);
+
+ return nodes;
+}
+
+template<typename T>
+struct HuffmanDecodeResult {
+ size_t bits_read;
+ Optional<HuffmanNode<T>> code;
+};
+
+template<typename T>
+HuffmanDecodeResult<T> huffman_decode(InputBitStream& bitstream, Span<HuffmanNode<T> const> tree, size_t max_bits_to_read)
+{
+ HuffmanNode<T> const* node = &tree[0];
+ size_t bits_read = 0;
+
+ while (!node->is_leaf() && !bitstream.has_any_error() && max_bits_to_read-- > 0) {
+ const bool direction = bitstream.read_bit_big_endian();
+ ++bits_read;
+ if (direction) {
+ if (node->left == -1)
+ return {};
+ node = &tree[node->left];
+ } else {
+ if (node->right == -1)
+ return {};
+ node = &tree[node->right];
+ }
+ }
+
+ if (!node->is_leaf())
+ return { bits_read, {} };
+ return { bits_read, *node };
+}
+
+struct HuffmanXY {
+ int x;
+ int y;
+};
+
+struct HuffmanVWXY {
+ int v;
+ int w;
+ int x;
+ int y;
+};
+
+struct HuffmanEntryXY : public HuffmanEntry<HuffmanXY> {
+ constexpr HuffmanEntryXY(int x, int y, size_t code_length, unsigned code)
+ {
+ symbol.x = x;
+ symbol.y = y;
+ this->code_length = code_length;
+ this->code = code;
+ }
+};
+
+struct HuffmanEntryVWXY : public HuffmanEntry<HuffmanVWXY> {
+ constexpr HuffmanEntryVWXY(int v, int w, int x, int y, size_t code_length, unsigned code)
+ {
+ symbol.v = v;
+ symbol.w = w;
+ symbol.x = x;
+ symbol.y = y;
+ this->code_length = code_length;
+ this->code = code;
+ }
+};
+
+// All data taken from ISO/IEC 11172-3 (Table B.7)
+constexpr HuffmanEntries<HuffmanEntryVWXY, 16> TableA { {
+ { 0, 0, 0, 0, 1, 0b1 },
+ { 0, 0, 0, 1, 4, 0b0101 },
+ { 0, 0, 1, 0, 4, 0b0100 },
+ { 0, 0, 1, 1, 5, 0b00101 },
+ { 0, 1, 0, 0, 4, 0b0110 },
+ { 0, 1, 0, 1, 6, 0b000101 },
+ { 0, 1, 1, 0, 5, 0b00100 },
+ { 0, 1, 1, 1, 6, 0b000100 },
+ { 1, 0, 0, 0, 4, 0b0111 },
+ { 1, 0, 0, 1, 5, 0b00011 },
+ { 1, 0, 1, 0, 5, 0b00110 },
+ { 1, 0, 1, 1, 6, 0b000000 },
+ { 1, 1, 0, 0, 5, 0b00111 },
+ { 1, 1, 0, 1, 6, 0b000010 },
+ { 1, 1, 1, 0, 6, 0b000011 },
+ { 1, 1, 1, 1, 6, 0b000001 },
+} };
+
+constexpr HuffmanEntries<HuffmanEntryVWXY, 16> TableB { {
+ { 0, 0, 0, 0, 4, 0b1111 },
+ { 0, 0, 0, 1, 4, 0b1110 },
+ { 0, 0, 1, 0, 4, 0b1101 },
+ { 0, 0, 1, 1, 4, 0b1100 },
+ { 0, 1, 0, 0, 4, 0b1011 },
+ { 0, 1, 0, 1, 4, 0b1010 },
+ { 0, 1, 1, 0, 4, 0b1001 },
+ { 0, 1, 1, 1, 4, 0b1000 },
+ { 1, 0, 0, 0, 4, 0b0111 },
+ { 1, 0, 0, 1, 4, 0b0110 },
+ { 1, 0, 1, 0, 4, 0b0101 },
+ { 1, 0, 1, 1, 4, 0b0100 },
+ { 1, 1, 0, 0, 4, 0b0011 },
+ { 1, 1, 0, 1, 4, 0b0010 },
+ { 1, 1, 1, 0, 4, 0b0001 },
+ { 1, 1, 1, 1, 4, 0b0000 },
+} };
+
+constexpr HuffmanEntries<HuffmanEntryXY, 1> Table0 { {
+ { 0, 0, 0, 0b0 },
+} };
+
+constexpr HuffmanEntries<HuffmanEntryXY, 4> Table1 { {
+ { 0, 0, 1, 0b1 },
+ { 0, 1, 3, 0b001 },
+ { 1, 0, 2, 0b01 },
+ { 1, 1, 3, 0b000 },
+} };
+
+constexpr HuffmanEntries<HuffmanEntryXY, 9> Table2 { {
+ { 0, 0, 1, 0b1 },
+ { 0, 1, 3, 0b010 },
+ { 0, 2, 6, 0b000001 },
+ { 1, 0, 3, 0b011 },
+ { 1, 1, 3, 0b001 },
+ { 1, 2, 5, 0b00001 },
+ { 2, 0, 5, 0b00011 },
+ { 2, 1, 5, 0b00010 },
+ { 2, 2, 6, 0b000000 },
+} };
+
+constexpr HuffmanEntries<HuffmanEntryXY, 9> Table3 { {
+ { 0, 0, 2, 0b11 },
+ { 0, 1, 2, 0b10 },
+ { 0, 2, 6, 0b000001 },
+ { 1, 0, 3, 0b001 },
+ { 1, 1, 2, 0b01 },
+ { 1, 2, 5, 0b00001 },
+ { 2, 0, 5, 0b00011 },
+ { 2, 1, 5, 0b00010 },
+ { 2, 2, 6, 0b000000 },
+} };
+
+constexpr HuffmanEntries<HuffmanEntryXY, 16> Table5 { {
+ { 0, 0, 1, 0b1 },
+ { 0, 1, 3, 0b010 },
+ { 0, 2, 6, 0b000110 },
+ { 0, 3, 7, 0b0000101 },
+ { 1, 0, 3, 0b011 },
+ { 1, 1, 3, 0b001 },
+ { 1, 2, 6, 0b000100 },
+ { 1, 3, 7, 0b0000100 },
+ { 2, 0, 6, 0b000111 },
+ { 2, 1, 6, 0b000101 },
+ { 2, 2, 7, 0b0000111 },
+ { 2, 3, 8, 0b00000001 },
+ { 3, 0, 7, 0b0000110 },
+ { 3, 1, 6, 0b000001 },
+ { 3, 2, 7, 0b0000001 },
+ { 3, 3, 8, 0b00000000 },
+} };
+
+constexpr HuffmanEntries<HuffmanEntryXY, 16> Table6 { {
+ { 0, 0, 3, 0b111 },
+ { 0, 1, 3, 0b011 },
+ { 0, 2, 5, 0b00101 },
+ { 0, 3, 7, 0b0000001 },
+ { 1, 0, 3, 0b110 },
+ { 1, 1, 2, 0b10 },
+ { 1, 2, 4, 0b0011 },
+ { 1, 3, 5, 0b00010 },
+ { 2, 0, 4, 0b0101 },
+ { 2, 1, 4, 0b0100 },
+ { 2, 2, 5, 0b00100 },
+ { 2, 3, 6, 0b000001 },
+ { 3, 0, 6, 0b000011 },
+ { 3, 1, 5, 0b00011 },
+ { 3, 2, 6, 0b000010 },
+ { 3, 3, 7, 0b0000000 },
+} };
+
+constexpr HuffmanEntries<HuffmanEntryXY, 36> Table7 { {
+ { 0, 0, 1, 0b1 },
+ { 0, 1, 3, 0b010 },
+ { 0, 2, 6, 0b001010 },
+ { 0, 3, 8, 0b00010011 },
+ { 0, 4, 8, 0b00010000 },
+ { 0, 5, 9, 0b000001010 },
+ { 1, 0, 3, 0b011 },
+ { 1, 1, 4, 0b0011 },
+ { 1, 2, 6, 0b000111 },
+ { 1, 3, 7, 0b0001010 },
+ { 1, 4, 7, 0b0000101 },
+ { 1, 5, 8, 0b00000011 },
+ { 2, 0, 6, 0b001011 },
+ { 2, 1, 5, 0b00100 },
+ { 2, 2, 7, 0b0001101 },
+ { 2, 3, 8, 0b00010001 },
+ { 2, 4, 8, 0b00001000 },
+ { 2, 5, 9, 0b000000100 },
+ { 3, 0, 7, 0b0001100 },
+ { 3, 1, 7, 0b0001011 },
+ { 3, 2, 8, 0b00010010 },
+ { 3, 3, 9, 0b000001111 },
+ { 3, 4, 9, 0b000001011 },
+ { 3, 5, 9, 0b000000010 },
+ { 4, 0, 7, 0b0000111 },
+ { 4, 1, 7, 0b0000110 },
+ { 4, 2, 8, 0b00001001 },
+ { 4, 3, 9, 0b000001110 },
+ { 4, 4, 9, 0b000000011 },
+ { 4, 5, 10, 0b0000000001 },
+ { 5, 0, 8, 0b00000110 },
+ { 5, 1, 8, 0b00000100 },
+ { 5, 2, 9, 0b000000101 },
+ { 5, 3, 10, 0b0000000011 },
+ { 5, 4, 10, 0b0000000010 },
+ { 5, 5, 10, 0b0000000000 },
+} };
+
+constexpr HuffmanEntries<HuffmanEntryXY, 36> Table8 { {
+ { 0, 0, 2, 0b11 },
+ { 0, 1, 3, 0b100 },
+ { 0, 2, 6, 0b000110 },
+ { 0, 3, 8, 0b00010010 },
+ { 0, 4, 8, 0b00001100 },
+ { 0, 5, 9, 0b000000101 },
+ { 1, 0, 3, 0b101 },
+ { 1, 1, 2, 0b01 },
+ { 1, 2, 4, 0b0010 },
+ { 1, 3, 8, 0b00010000 },
+ { 1, 4, 8, 0b00001001 },
+ { 1, 5, 8, 0b00000011 },
+ { 2, 0, 6, 0b000111 },
+ { 2, 1, 4, 0b0011 },
+ { 2, 2, 6, 0b000101 },
+ { 2, 3, 8, 0b00001110 },
+ { 2, 4, 8, 0b00000111 },
+ { 2, 5, 9, 0b000000011 },
+ { 3, 0, 8, 0b00010011 },
+ { 3, 1, 8, 0b00010001 },
+ { 3, 2, 8, 0b00001111 },
+ { 3, 3, 9, 0b000001101 },
+ { 3, 4, 9, 0b000001010 },
+ { 3, 5, 10, 0b0000000100 },
+ { 4, 0, 8, 0b00001101 },
+ { 4, 1, 7, 0b0000101 },
+ { 4, 2, 8, 0b00001000 },
+ { 4, 3, 9, 0b000001011 },
+ { 4, 4, 10, 0b0000000101 },
+ { 4, 5, 10, 0b0000000001 },
+ { 5, 0, 9, 0b000001100 },
+ { 5, 1, 8, 0b00000100 },
+ { 5, 2, 9, 0b000000100 },
+ { 5, 3, 9, 0b000000001 },
+ { 5, 4, 11, 0b00000000001 },
+ { 5, 5, 11, 0b00000000000 },
+} };
+
+constexpr HuffmanEntries<HuffmanEntryXY, 36> Table9 { {
+ { 0, 0, 3, 0b111 },
+ { 0, 1, 3, 0b101 },
+ { 0, 2, 5, 0b01001 },
+ { 0, 3, 6, 0b001110 },
+ { 0, 4, 8, 0b00001111 },
+ { 0, 5, 9, 0b000000111 },
+ { 1, 0, 3, 0b110 },
+ { 1, 1, 3, 0b100 },
+ { 1, 2, 4, 0b0101 },
+ { 1, 3, 5, 0b00101 },
+ { 1, 4, 6, 0b000110 },
+ { 1, 5, 8, 0b00000111 },
+ { 2, 0, 4, 0b0111 },
+ { 2, 1, 4, 0b0110 },
+ { 2, 2, 5, 0b01000 },
+ { 2, 3, 6, 0b001000 },
+ { 2, 4, 7, 0b0001000 },
+ { 2, 5, 8, 0b00000101 },
+ { 3, 0, 6, 0b001111 },
+ { 3, 1, 5, 0b00110 },
+ { 3, 2, 6, 0b001001 },
+ { 3, 3, 7, 0b0001010 },
+ { 3, 4, 7, 0b0000101 },
+ { 3, 5, 8, 0b00000001 },
+ { 4, 0, 7, 0b0001011 },
+ { 4, 1, 6, 0b000111 },
+ { 4, 2, 7, 0b0001001 },
+ { 4, 3, 7, 0b0000110 },
+ { 4, 4, 8, 0b00000100 },
+ { 4, 5, 9, 0b000000001 },
+ { 5, 0, 8, 0b00001110 },
+ { 5, 1, 7, 0b0000100 },
+ { 5, 2, 8, 0b00000110 },
+ { 5, 3, 8, 0b00000010 },
+ { 5, 4, 9, 0b000000110 },
+ { 5, 5, 9, 0b000000000 },
+} };
+
+constexpr HuffmanEntries<HuffmanEntryXY, 64> Table10 { {
+ { 0, 0, 1, 0b1 },
+ { 0, 1, 3, 0b010 },
+ { 0, 2, 6, 0b001010 },
+ { 0, 3, 8, 0b00010111 },
+ { 0, 4, 9, 0b000100011 },
+ { 0, 5, 9, 0b000011110 },
+ { 0, 6, 9, 0b000001100 },
+ { 0, 7, 10, 0b0000010001 },
+ { 1, 0, 3, 0b011 },
+ { 1, 1, 4, 0b0011 },
+ { 1, 2, 6, 0b001000 },
+ { 1, 3, 7, 0b0001100 },
+ { 1, 4, 8, 0b00010010 },
+ { 1, 5, 9, 0b000010101 },
+ { 1, 6, 8, 0b00001100 },
+ { 1, 7, 8, 0b00000111 },
+ { 2, 0, 6, 0b001011 },
+ { 2, 1, 6, 0b001001 },
+ { 2, 2, 7, 0b0001111 },
+ { 2, 3, 8, 0b00010101 },
+ { 2, 4, 9, 0b000100000 },
+ { 2, 5, 10, 0b0000101000 },
+ { 2, 6, 9, 0b000010011 },
+ { 2, 7, 9, 0b000000110 },
+ { 3, 0, 7, 0b0001110 },
+ { 3, 1, 7, 0b0001101 },
+ { 3, 2, 8, 0b00010110 },
+ { 3, 3, 9, 0b000100010 },
+ { 3, 4, 10, 0b0000101110 },
+ { 3, 5, 10, 0b0000010111 },
+ { 3, 6, 9, 0b000010010 },
+ { 3, 7, 10, 0b0000000111 },
+ { 4, 0, 8, 0b00010100 },
+ { 4, 1, 8, 0b00010011 },
+ { 4, 2, 9, 0b000100001 },
+ { 4, 3, 10, 0b0000101111 },
+ { 4, 4, 10, 0b0000011011 },
+ { 4, 5, 10, 0b0000010110 },
+ { 4, 6, 10, 0b0000001001 },
+ { 4, 7, 10, 0b0000000011 },
+ { 5, 0, 9, 0b000011111 },
+ { 5, 1, 9, 0b000010110 },
+ { 5, 2, 10, 0b0000101001 },
+ { 5, 3, 10, 0b0000011010 },
+ { 5, 4, 11, 0b00000010101 },
+ { 5, 5, 11, 0b00000010100 },
+ { 5, 6, 10, 0b0000000101 },
+ { 5, 7, 11, 0b00000000011 },
+ { 6, 0, 8, 0b00001110 },
+ { 6, 1, 8, 0b00001101 },
+ { 6, 2, 9, 0b000001010 },
+ { 6, 3, 10, 0b0000001011 },
+ { 6, 4, 10, 0b0000010000 },
+ { 6, 5, 10, 0b0000000110 },
+ { 6, 6, 11, 0b00000000101 },
+ { 6, 7, 11, 0b00000000001 },
+ { 7, 0, 9, 0b000001001 },
+ { 7, 1, 8, 0b00001000 },
+ { 7, 2, 9, 0b000000111 },
+ { 7, 3, 10, 0b0000001000 },
+ { 7, 4, 10, 0b0000000100 },
+ { 7, 5, 11, 0b00000000100 },
+ { 7, 6, 11, 0b00000000010 },
+ { 7, 7, 11, 0b00000000000 },
+} };
+
+constexpr HuffmanEntries<HuffmanEntryXY, 64> Table11 { {
+ { 0, 0, 2, 0b11 },
+ { 0, 1, 3, 0b100 },
+ { 0, 2, 5, 0b01010 },
+ { 0, 3, 7, 0b0011000 },
+ { 0, 4, 8, 0b00100010 },
+ { 0, 5, 9, 0b000100001 },
+ { 0, 6, 8, 0b00010101 },
+ { 0, 7, 9, 0b000001111 },
+ { 1, 0, 3, 0b101 },
+ { 1, 1, 3, 0b011 },
+ { 1, 2, 4, 0b0100 },
+ { 1, 3, 6, 0b001010 },
+ { 1, 4, 8, 0b00100000 },
+ { 1, 5, 8, 0b00010001 },
+ { 1, 6, 7, 0b0001011 },
+ { 1, 7, 8, 0b00001010 },
+ { 2, 0, 5, 0b01011 },
+ { 2, 1, 5, 0b00111 },
+ { 2, 2, 6, 0b001101 },
+ { 2, 3, 7, 0b0010010 },
+ { 2, 4, 8, 0b00011110 },
+ { 2, 5, 9, 0b000011111 },
+ { 2, 6, 8, 0b00010100 },
+ { 2, 7, 8, 0b00000101 },
+ { 3, 0, 7, 0b0011001 },
+ { 3, 1, 6, 0b001011 },
+ { 3, 2, 7, 0b0010011 },
+ { 3, 3, 9, 0b000111011 },
+ { 3, 4, 8, 0b00011011 },
+ { 3, 5, 10, 0b0000010010 },
+ { 3, 6, 8, 0b00001100 },
+ { 3, 7, 9, 0b000000101 },
+ { 4, 0, 8, 0b00100011 },
+ { 4, 1, 8, 0b00100001 },
+ { 4, 2, 8, 0b00011111 },
+ { 4, 3, 9, 0b000111010 },
+ { 4, 4, 9, 0b000011110 },
+ { 4, 5, 10, 0b0000010000 },
+ { 4, 6, 9, 0b000000111 },
+ { 4, 7, 10, 0b0000000101 },
+ { 5, 0, 8, 0b00011100 },
+ { 5, 1, 8, 0b00011010 },
+ { 5, 2, 9, 0b000100000 },
+ { 5, 3, 10, 0b0000010011 },
+ { 5, 4, 10, 0b0000010001 },
+ { 5, 5, 11, 0b00000001111 },
+ { 5, 6, 10, 0b0000001000 },
+ { 5, 7, 11, 0b00000001110 },
+ { 6, 0, 8, 0b00001110 },
+ { 6, 1, 7, 0b0001100 },
+ { 6, 2, 7, 0b0001001 },
+ { 6, 3, 8, 0b00001101 },
+ { 6, 4, 9, 0b000001110 },
+ { 6, 5, 10, 0b0000001001 },
+ { 6, 6, 10, 0b0000000100 },
+ { 6, 7, 10, 0b0000000001 },
+ { 7, 0, 8, 0b00001011 },
+ { 7, 1, 7, 0b0000100 },
+ { 7, 2, 8, 0b00000110 },
+ { 7, 3, 9, 0b000000110 },
+ { 7, 4, 10, 0b0000000110 },
+ { 7, 5, 10, 0b0000000011 },
+ { 7, 6, 10, 0b0000000010 },
+ { 7, 7, 10, 0b0000000000 },
+} };
+
+constexpr HuffmanEntries<HuffmanEntryXY, 64> Table12 { {
+ { 0, 0, 4, 0b1001 },
+ { 0, 1, 3, 0b110 },
+ { 0, 2, 5, 0b10000 },
+ { 0, 3, 7, 0b0100001 },
+ { 0, 4, 8, 0b00101001 },
+ { 0, 5, 9, 0b000100111 },
+ { 0, 6, 9, 0b000100110 },
+ { 0, 7, 9, 0b000011010 },
+ { 1, 0, 3, 0b111 },
+ { 1, 1, 3, 0b101 },
+ { 1, 2, 4, 0b0110 },
+ { 1, 3, 5, 0b01001 },
+ { 1, 4, 7, 0b0010111 },
+ { 1, 5, 7, 0b0010000 },
+ { 1, 6, 8, 0b00011010 },
+ { 1, 7, 8, 0b00001011 },
+ { 2, 0, 5, 0b10001 },
+ { 2, 1, 4, 0b0111 },
+ { 2, 2, 5, 0b01011 },
+ { 2, 3, 6, 0b001110 },
+ { 2, 4, 7, 0b0010101 },
+ { 2, 5, 8, 0b00011110 },
+ { 2, 6, 7, 0b0001010 },
+ { 2, 7, 8, 0b00000111 },
+ { 3, 0, 6, 0b010001 },
+ { 3, 1, 5, 0b01010 },
+ { 3, 2, 6, 0b001111 },
+ { 3, 3, 6, 0b001100 },
+ { 3, 4, 7, 0b0010010 },
+ { 3, 5, 8, 0b00011100 },
+ { 3, 6, 8, 0b00001110 },
+ { 3, 7, 8, 0b00000101 },
+ { 4, 0, 7, 0b0100000 },
+ { 4, 1, 6, 0b001101 },
+ { 4, 2, 7, 0b0010110 },
+ { 4, 3, 7, 0b0010011 },
+ { 4, 4, 8, 0b00010010 },
+ { 4, 5, 8, 0b00010000 },
+ { 4, 6, 8, 0b00001001 },
+ { 4, 7, 9, 0b000000101 },
+ { 5, 0, 8, 0b00101000 },
+ { 5, 1, 7, 0b0010001 },
+ { 5, 2, 8, 0b00011111 },
+ { 5, 3, 8, 0b00011101 },
+ { 5, 4, 8, 0b00010001 },
+ { 5, 5, 9, 0b000001101 },
+ { 5, 6, 8, 0b00000100 },
+ { 5, 7, 9, 0b000000010 },
+ { 6, 0, 8, 0b00011011 },
+ { 6, 1, 7, 0b0001100 },
+ { 6, 2, 7, 0b0001011 },
+ { 6, 3, 8, 0b00001111 },
+ { 6, 4, 8, 0b00001010 },
+ { 6, 5, 9, 0b000000111 },
+ { 6, 6, 9, 0b000000100 },
+ { 6, 7, 10, 0b0000000001 },
+ { 7, 0, 9, 0b000011011 },
+ { 7, 1, 8, 0b00001100 },
+ { 7, 2, 8, 0b00001000 },
+ { 7, 3, 9, 0b000001100 },
+ { 7, 4, 9, 0b000000110 },
+ { 7, 5, 9, 0b000000011 },
+ { 7, 6, 9, 0b000000001 },
+ { 7, 7, 10, 0b0000000000 },
+} };
+
+constexpr HuffmanEntries<HuffmanEntryXY, 256> Table13 { {
+ { 0, 0, 1, 0b1 },
+ { 0, 1, 4, 0b0101 },
+ { 0, 2, 6, 0b001110 },
+ { 0, 3, 7, 0b0010101 },
+ { 0, 4, 8, 0b00100010 },
+ { 0, 5, 9, 0b000110011 },
+ { 0, 6, 9, 0b000101110 },
+ { 0, 7, 10, 0b0001000111 },
+ { 0, 8, 9, 0b000101010 },
+ { 0, 9, 10, 0b0000110100 },
+ { 0, 10, 11, 0b00001000100 },
+ { 0, 11, 11, 0b00000110100 },
+ { 0, 12, 12, 0b000001000011 },
+ { 0, 13, 12, 0b000000101100 },
+ { 0, 14, 13, 0b0000000101011 },
+ { 0, 15, 13, 0b0000000010011 },
+ { 1, 0, 3, 0b011 },
+ { 1, 1, 4, 0b0100 },
+ { 1, 2, 6, 0b001100 },
+ { 1, 3, 7, 0b0010011 },
+ { 1, 4, 8, 0b00011111 },
+ { 1, 5, 8, 0b00011010 },
+ { 1, 6, 9, 0b000101100 },
+ { 1, 7, 9, 0b000100001 },
+ { 1, 8, 9, 0b000011111 },
+ { 1, 9, 9, 0b000011000 },
+ { 1, 10, 10, 0b0000100000 },
+ { 1, 11, 10, 0b0000011000 },
+ { 1, 12, 11, 0b00000011111 },
+ { 1, 13, 12, 0b000000100011 },
+ { 1, 14, 12, 0b000000010110 },
+ { 1, 15, 12, 0b000000001110 },
+ { 2, 0, 6, 0b001111 },
+ { 2, 1, 6, 0b001101 },
+ { 2, 2, 7, 0b0010111 },
+ { 2, 3, 8, 0b00100100 },
+ { 2, 4, 9, 0b000111011 },
+ { 2, 5, 9, 0b000110001 },
+ { 2, 6, 10, 0b0001001101 },
+ { 2, 7, 10, 0b0001000001 },
+ { 2, 8, 9, 0b000011101 },
+ { 2, 9, 10, 0b0000101000 },
+ { 2, 10, 10, 0b0000011110 },
+ { 2, 11, 11, 0b00000101000 },
+ { 2, 12, 11, 0b00000011011 },
+ { 2, 13, 12, 0b000000100001 },
+ { 2, 14, 13, 0b0000000101010 },
+ { 2, 15, 13, 0b0000000010000 },
+ { 3, 0, 7, 0b0010110 },
+ { 3, 1, 7, 0b0010100 },
+ { 3, 2, 8, 0b00100101 },
+ { 3, 3, 9, 0b000111101 },
+ { 3, 4, 9, 0b000111000 },
+ { 3, 5, 10, 0b0001001111 },
+ { 3, 6, 10, 0b0001001001 },
+ { 3, 7, 10, 0b0001000000 },
+ { 3, 8, 10, 0b0000101011 },
+ { 3, 9, 11, 0b00001001100 },
+ { 3, 10, 11, 0b00000111000 },
+ { 3, 11, 11, 0b00000100101 },
+ { 3, 12, 11, 0b00000011010 },
+ { 3, 13, 12, 0b000000011111 },
+ { 3, 14, 13, 0b0000000011001 },
+ { 3, 15, 13, 0b0000000001110 },
+ { 4, 0, 8, 0b00100011 },
+ { 4, 1, 7, 0b0010000 },
+ { 4, 2, 9, 0b000111100 },
+ { 4, 3, 9, 0b000111001 },
+ { 4, 4, 10, 0b0001100001 },
+ { 4, 5, 10, 0b0001001011 },
+ { 4, 6, 11, 0b00001110010 },
+ { 4, 7, 11, 0b00001011011 },
+ { 4, 8, 10, 0b0000110110 },
+ { 4, 9, 11, 0b00001001001 },
+ { 4, 10, 11, 0b00000110111 },
+ { 4, 11, 12, 0b000000101001 },
+ { 4, 12, 12, 0b000000110000 },
+ { 4, 13, 13, 0b0000000110101 },
+ { 4, 14, 13, 0b0000000010111 },
+ { 4, 15, 14, 0b00000000011000 },
+ { 5, 0, 9, 0b000111010 },
+ { 5, 1, 8, 0b00011011 },
+ { 5, 2, 9, 0b000110010 },
+ { 5, 3, 10, 0b0001100000 },
+ { 5, 4, 10, 0b0001001100 },
+ { 5, 5, 10, 0b0001000110 },
+ { 5, 6, 11, 0b00001011101 },
+ { 5, 7, 11, 0b00001010100 },
+ { 5, 8, 11, 0b00001001101 },
+ { 5, 9, 11, 0b00000111010 },
+ { 5, 10, 12, 0b000001001111 },
+ { 5, 11, 11, 0b00000011101 },
+ { 5, 12, 13, 0b0000001001010 },
+ { 5, 13, 13, 0b0000000110001 },
+ { 5, 14, 14, 0b00000000101001 },
+ { 5, 15, 14, 0b00000000010001 },
+ { 6, 0, 9, 0b000101111 },
+ { 6, 1, 9, 0b000101101 },
+ { 6, 2, 10, 0b0001001110 },
+ { 6, 3, 10, 0b0001001010 },
+ { 6, 4, 11, 0b00001110011 },
+ { 6, 5, 11, 0b00001011110 },
+ { 6, 6, 11, 0b00001011010 },
+ { 6, 7, 11, 0b00001001111 },
+ { 6, 8, 11, 0b00001000101 },
+ { 6, 9, 12, 0b000001010011 },
+ { 6, 10, 12, 0b000001000111 },
+ { 6, 11, 12, 0b000000110010 },
+ { 6, 12, 13, 0b0000000111011 },
+ { 6, 13, 13, 0b0000000100110 },
+ { 6, 14, 14, 0b00000000100100 },
+ { 6, 15, 14, 0b00000000001111 },
+ { 7, 0, 10, 0b0001001000 },
+ { 7, 1, 9, 0b000100010 },
+ { 7, 2, 10, 0b0000111000 },
+ { 7, 3, 11, 0b00001011111 },
+ { 7, 4, 11, 0b00001011100 },
+ { 7, 5, 11, 0b00001010101 },
+ { 7, 6, 12, 0b000001011011 },
+ { 7, 7, 12, 0b000001011010 },
+ { 7, 8, 12, 0b000001010110 },
+ { 7, 9, 12, 0b000001001001 },
+ { 7, 10, 13, 0b0000001001101 },
+ { 7, 11, 13, 0b0000001000001 },
+ { 7, 12, 13, 0b0000000110011 },
+ { 7, 13, 14, 0b00000000101100 },
+ { 7, 14, 16, 0b0000000000101011 },
+ { 7, 15, 16, 0b0000000000101010 },
+ { 8, 0, 9, 0b000101011 },
+ { 8, 1, 8, 0b00010100 },
+ { 8, 2, 9, 0b000011110 },
+ { 8, 3, 10, 0b0000101100 },
+ { 8, 4, 10, 0b0000110111 },
+ { 8, 5, 11, 0b00001001110 },
+ { 8, 6, 11, 0b00001001000 },
+ { 8, 7, 12, 0b000001010111 },
+ { 8, 8, 12, 0b000001001110 },
+ { 8, 9, 12, 0b000000111101 },
+ { 8, 10, 12, 0b000000101110 },
+ { 8, 11, 13, 0b0000000110110 },
+ { 8, 12, 13, 0b0000000100101 },
+ { 8, 13, 14, 0b00000000011110 },
+ { 8, 14, 15, 0b000000000010100 },
+ { 8, 15, 15, 0b000000000010000 },
+ { 9, 0, 10, 0b0000110101 },
+ { 9, 1, 9, 0b000011001 },
+ { 9, 2, 10, 0b0000101001 },
+ { 9, 3, 10, 0b0000100101 },
+ { 9, 4, 11, 0b00000101100 },
+ { 9, 5, 11, 0b00000111011 },
+ { 9, 6, 11, 0b00000110110 },
+ { 9, 7, 13, 0b0000001010001 },
+ { 9, 8, 12, 0b000001000010 },
+ { 9, 9, 13, 0b0000001001100 },
+ { 9, 10, 13, 0b0000000111001 },
+ { 9, 11, 14, 0b00000000110110 },
+ { 9, 12, 14, 0b00000000100101 },
+ { 9, 13, 14, 0b00000000010010 },
+ { 9, 14, 16, 0b0000000000100111 },
+ { 9, 15, 15, 0b000000000001011 },
+ { 10, 0, 10, 0b0000100011 },
+ { 10, 1, 10, 0b0000100001 },
+ { 10, 2, 10, 0b0000011111 },
+ { 10, 3, 11, 0b00000111001 },
+ { 10, 4, 11, 0b00000101010 },
+ { 10, 5, 12, 0b000001010010 },
+ { 10, 6, 12, 0b000001001000 },
+ { 10, 7, 13, 0b0000001010000 },
+ { 10, 8, 12, 0b000000101111 },
+ { 10, 9, 13, 0b0000000111010 },
+ { 10, 10, 14, 0b00000000110111 },
+ { 10, 11, 13, 0b0000000010101 },
+ { 10, 12, 14, 0b00000000010110 },
+ { 10, 13, 15, 0b000000000011010 },
+ { 10, 14, 16, 0b0000000000100110 },
+ { 10, 15, 17, 0b00000000000010110 },
+ { 11, 0, 11, 0b00000110101 },
+ { 11, 1, 10, 0b0000011001 },
+ { 11, 2, 10, 0b0000010111 },
+ { 11, 3, 11, 0b00000100110 },
+ { 11, 4, 12, 0b000001000110 },
+ { 11, 5, 12, 0b000000111100 },
+ { 11, 6, 12, 0b000000110011 },
+ { 11, 7, 12, 0b000000100100 },
+ { 11, 8, 13, 0b0000000110111 },
+ { 11, 9, 13, 0b0000000011010 },
+ { 11, 10, 13, 0b0000000100010 },
+ { 11, 11, 14, 0b00000000010111 },
+ { 11, 12, 15, 0b000000000011011 },
+ { 11, 13, 15, 0b000000000001110 },
+ { 11, 14, 15, 0b000000000001001 },
+ { 11, 15, 16, 0b0000000000000111 },
+ { 12, 0, 11, 0b00000100010 },
+ { 12, 1, 11, 0b00000100000 },
+ { 12, 2, 11, 0b00000011100 },
+ { 12, 3, 12, 0b000000100111 },
+ { 12, 4, 12, 0b000000110001 },
+ { 12, 5, 13, 0b0000001001011 },
+ { 12, 6, 12, 0b000000011110 },
+ { 12, 7, 13, 0b0000000110100 },
+ { 12, 8, 14, 0b00000000110000 },
+ { 12, 9, 14, 0b00000000101000 },
+ { 12, 10, 15, 0b000000000110100 },
+ { 12, 11, 15, 0b000000000011100 },
+ { 12, 12, 15, 0b000000000010010 },
+ { 12, 13, 16, 0b0000000000010001 },
+ { 12, 14, 16, 0b0000000000001001 },
+ { 12, 15, 16, 0b0000000000000101 },
+ { 13, 0, 12, 0b000000101101 },
+ { 13, 1, 11, 0b00000010101 },
+ { 13, 2, 12, 0b000000100010 },
+ { 13, 3, 13, 0b0000001000000 },
+ { 13, 4, 13, 0b0000000111000 },
+ { 13, 5, 13, 0b0000000110010 },
+ { 13, 6, 14, 0b00000000110001 },
+ { 13, 7, 14, 0b00000000101101 },
+ { 13, 8, 14, 0b00000000011111 },
+ { 13, 9, 14, 0b00000000010011 },
+ { 13, 10, 14, 0b00000000001100 },
+ { 13, 11, 15, 0b000000000001111 },
+ { 13, 12, 16, 0b0000000000001010 },
+ { 13, 13, 15, 0b000000000000111 },
+ { 13, 14, 16, 0b0000000000000110 },
+ { 13, 15, 16, 0b0000000000000011 },
+ { 14, 0, 13, 0b0000000110000 },
+ { 14, 1, 12, 0b000000010111 },
+ { 14, 2, 12, 0b000000010100 },
+ { 14, 3, 13, 0b0000000100111 },
+ { 14, 4, 13, 0b0000000100100 },
+ { 14, 5, 13, 0b0000000100011 },
+ { 14, 6, 15, 0b000000000110101 },
+ { 14, 7, 14, 0b00000000010101 },
+ { 14, 8, 14, 0b00000000010000 },
+ { 14, 9, 17, 0b00000000000010111 },
+ { 14, 10, 15, 0b000000000001101 },
+ { 14, 11, 15, 0b000000000001010 },
+ { 14, 12, 15, 0b000000000000110 },
+ { 14, 13, 17, 0b00000000000000001 },
+ { 14, 14, 16, 0b0000000000000100 },
+ { 14, 15, 16, 0b0000000000000010 },
+ { 15, 0, 12, 0b000000010000 },
+ { 15, 1, 12, 0b000000001111 },
+ { 15, 2, 13, 0b0000000010001 },
+ { 15, 3, 14, 0b00000000011011 },
+ { 15, 4, 14, 0b00000000011001 },
+ { 15, 5, 14, 0b00000000010100 },
+ { 15, 6, 15, 0b000000000011101 },
+ { 15, 7, 14, 0b00000000001011 },
+ { 15, 8, 15, 0b000000000010001 },
+ { 15, 9, 15, 0b000000000001100 },
+ { 15, 10, 16, 0b0000000000010000 },
+ { 15, 11, 16, 0b0000000000001000 },
+ { 15, 12, 19, 0b0000000000000000001 },
+ { 15, 13, 18, 0b000000000000000001 },
+ { 15, 14, 19, 0b0000000000000000000 },
+ { 15, 15, 16, 0b0000000000000001 },
+} };
+
+constexpr HuffmanEntries<HuffmanEntryXY, 256> Table15 { {
+ { 0, 0, 3, 0b111 },
+ { 0, 1, 4, 0b1100 },
+ { 0, 2, 5, 0b10010 },
+ { 0, 3, 7, 0b0110101 },
+ { 0, 4, 7, 0b0101111 },
+ { 0, 5, 8, 0b01001100 },
+ { 0, 6, 9, 0b001111100 },
+ { 0, 7, 9, 0b001101100 },
+ { 0, 8, 9, 0b001011001 },
+ { 0, 9, 10, 0b0001111011 },
+ { 0, 10, 10, 0b0001101100 },
+ { 0, 11, 11, 0b00001110111 },
+ { 0, 12, 11, 0b00001101011 },
+ { 0, 13, 11, 0b00001010001 },
+ { 0, 14, 12, 0b000001111010 },
+ { 0, 15, 13, 0b0000000111111 },
+ { 1, 0, 4, 0b1101 },
+ { 1, 1, 3, 0b101 },
+ { 1, 2, 5, 0b10000 },
+ { 1, 3, 6, 0b011011 },
+ { 1, 4, 7, 0b0101110 },
+ { 1, 5, 7, 0b0100100 },
+ { 1, 6, 8, 0b00111101 },
+ { 1, 7, 8, 0b00110011 },
+ { 1, 8, 8, 0b00101010 },
+ { 1, 9, 9, 0b001000110 },
+ { 1, 10, 9, 0b000110100 },
+ { 1, 11, 10, 0b0001010011 },
+ { 1, 12, 10, 0b0001000001 },
+ { 1, 13, 10, 0b0000101001 },
+ { 1, 14, 11, 0b00000111011 },
+ { 1, 15, 11, 0b00000100100 },
+ { 2, 0, 5, 0b10011 },
+ { 2, 1, 5, 0b10001 },
+ { 2, 2, 5, 0b01111 },
+ { 2, 3, 6, 0b011000 },
+ { 2, 4, 7, 0b0101001 },
+ { 2, 5, 7, 0b0100010 },
+ { 2, 6, 8, 0b00111011 },
+ { 2, 7, 8, 0b00110000 },
+ { 2, 8, 8, 0b00101000 },
+ { 2, 9, 9, 0b001000000 },
+ { 2, 10, 9, 0b000110010 },
+ { 2, 11, 10, 0b0001001110 },
+ { 2, 12, 10, 0b0000111110 },
+ { 2, 13, 11, 0b00001010000 },
+ { 2, 14, 11, 0b00000111000 },
+ { 2, 15, 11, 0b00000100001 },
+ { 3, 0, 6, 0b011101 },
+ { 3, 1, 6, 0b011100 },
+ { 3, 2, 6, 0b011001 },
+ { 3, 3, 7, 0b0101011 },
+ { 3, 4, 7, 0b0100111 },
+ { 3, 5, 8, 0b00111111 },
+ { 3, 6, 8, 0b00110111 },
+ { 3, 7, 9, 0b001011101 },
+ { 3, 8, 9, 0b001001100 },
+ { 3, 9, 9, 0b000111011 },
+ { 3, 10, 10, 0b0001011101 },
+ { 3, 11, 10, 0b0001001000 },
+ { 3, 12, 10, 0b0000110110 },
+ { 3, 13, 11, 0b00001001011 },
+ { 3, 14, 11, 0b00000110010 },
+ { 3, 15, 11, 0b00000011101 },
+ { 4, 0, 7, 0b0110100 },
+ { 4, 1, 6, 0b010110 },
+ { 4, 2, 7, 0b0101010 },
+ { 4, 3, 7, 0b0101000 },
+ { 4, 4, 8, 0b01000011 },
+ { 4, 5, 8, 0b00111001 },
+ { 4, 6, 9, 0b001011111 },
+ { 4, 7, 9, 0b001001111 },
+ { 4, 8, 9, 0b001001000 },
+ { 4, 9, 9, 0b000111001 },
+ { 4, 10, 10, 0b0001011001 },
+ { 4, 11, 10, 0b0001000101 },
+ { 4, 12, 10, 0b0000110001 },
+ { 4, 13, 11, 0b00001000010 },
+ { 4, 14, 11, 0b00000101110 },
+ { 4, 15, 11, 0b00000011011 },
+ { 5, 0, 8, 0b01001101 },
+ { 5, 1, 7, 0b0100101 },
+ { 5, 2, 7, 0b0100011 },
+ { 5, 3, 8, 0b01000010 },
+ { 5, 4, 8, 0b00111010 },
+ { 5, 5, 8, 0b00110100 },
+ { 5, 6, 9, 0b001011011 },
+ { 5, 7, 9, 0b001001010 },
+ { 5, 8, 9, 0b000111110 },
+ { 5, 9, 9, 0b000110000 },
+ { 5, 10, 10, 0b0001001111 },
+ { 5, 11, 10, 0b0000111111 },
+ { 5, 12, 11, 0b00001011010 },
+ { 5, 13, 11, 0b00000111110 },
+ { 5, 14, 11, 0b00000101000 },
+ { 5, 15, 12, 0b000000100110 },
+ { 6, 0, 9, 0b001111101 },
+ { 6, 1, 7, 0b0100000 },
+ { 6, 2, 8, 0b00111100 },
+ { 6, 3, 8, 0b00111000 },
+ { 6, 4, 8, 0b00110010 },
+ { 6, 5, 9, 0b001011100 },
+ { 6, 6, 9, 0b001001110 },
+ { 6, 7, 9, 0b001000001 },
+ { 6, 8, 9, 0b000110111 },
+ { 6, 9, 10, 0b0001010111 },
+ { 6, 10, 10, 0b0001000111 },
+ { 6, 11, 10, 0b0000110011 },
+ { 6, 12, 11, 0b00001001001 },
+ { 6, 13, 11, 0b00000110011 },
+ { 6, 14, 12, 0b000001000110 },
+ { 6, 15, 12, 0b000000011110 },
+ { 7, 0, 9, 0b001101101 },
+ { 7, 1, 8, 0b00110101 },
+ { 7, 2, 8, 0b00110001 },
+ { 7, 3, 9, 0b001011110 },
+ { 7, 4, 9, 0b001011000 },
+ { 7, 5, 9, 0b001001011 },
+ { 7, 6, 9, 0b001000010 },
+ { 7, 7, 10, 0b0001111010 },
+ { 7, 8, 10, 0b0001011011 },
+ { 7, 9, 10, 0b0001001001 },
+ { 7, 10, 10, 0b0000111000 },
+ { 7, 11, 10, 0b0000101010 },
+ { 7, 12, 11, 0b00001000000 },
+ { 7, 13, 11, 0b00000101100 },
+ { 7, 14, 11, 0b00000010101 },
+ { 7, 15, 12, 0b000000011001 },
+ { 8, 0, 9, 0b001011010 },
+ { 8, 1, 8, 0b00101011 },
+ { 8, 2, 8, 0b00101001 },
+ { 8, 3, 9, 0b001001101 },
+ { 8, 4, 9, 0b001001001 },
+ { 8, 5, 9, 0b000111111 },
+ { 8, 6, 9, 0b000111000 },
+ { 8, 7, 10, 0b0001011100 },
+ { 8, 8, 10, 0b0001001101 },
+ { 8, 9, 10, 0b0001000010 },
+ { 8, 10, 10, 0b0000101111 },
+ { 8, 11, 11, 0b00001000011 },
+ { 8, 12, 11, 0b00000110000 },
+ { 8, 13, 12, 0b000000110101 },
+ { 8, 14, 12, 0b000000100100 },
+ { 8, 15, 12, 0b000000010100 },
+ { 9, 0, 9, 0b001000111 },
+ { 9, 1, 8, 0b00100010 },
+ { 9, 2, 9, 0b001000011 },
+ { 9, 3, 9, 0b000111100 },
+ { 9, 4, 9, 0b000111010 },
+ { 9, 5, 9, 0b000110001 },
+ { 9, 6, 10, 0b0001011000 },
+ { 9, 7, 10, 0b0001001100 },
+ { 9, 8, 10, 0b0001000011 },
+ { 9, 9, 11, 0b00001101010 },
+ { 9, 10, 11, 0b00001000111 },
+ { 9, 11, 11, 0b00000110110 },
+ { 9, 12, 11, 0b00000100110 },
+ { 9, 13, 12, 0b000000100111 },
+ { 9, 14, 12, 0b000000010111 },
+ { 9, 15, 12, 0b000000001111 },
+ { 10, 0, 10, 0b0001101101 },
+ { 10, 1, 9, 0b000110101 },
+ { 10, 2, 9, 0b000110011 },
+ { 10, 3, 9, 0b000101111 },
+ { 10, 4, 10, 0b0001011010 },
+ { 10, 5, 10, 0b0001010010 },
+ { 10, 6, 10, 0b0000111010 },
+ { 10, 7, 10, 0b0000111001 },
+ { 10, 8, 10, 0b0000110000 },
+ { 10, 9, 11, 0b00001001000 },
+ { 10, 10, 11, 0b00000111001 },
+ { 10, 11, 11, 0b00000101001 },
+ { 10, 12, 11, 0b00000010111 },
+ { 10, 13, 12, 0b000000011011 },
+ { 10, 14, 13, 0b0000000111110 },
+ { 10, 15, 12, 0b000000001001 },
+ { 11, 0, 10, 0b0001010110 },
+ { 11, 1, 9, 0b000101010 },
+ { 11, 2, 9, 0b000101000 },
+ { 11, 3, 9, 0b000100101 },
+ { 11, 4, 10, 0b0001000110 },
+ { 11, 5, 10, 0b0001000000 },
+ { 11, 6, 10, 0b0000110100 },
+ { 11, 7, 10, 0b0000101011 },
+ { 11, 8, 11, 0b00001000110 },
+ { 11, 9, 11, 0b00000110111 },
+ { 11, 10, 11, 0b00000101010 },
+ { 11, 11, 11, 0b00000011001 },
+ { 11, 12, 12, 0b000000011101 },
+ { 11, 13, 12, 0b000000010010 },
+ { 11, 14, 12, 0b000000001011 },
+ { 11, 15, 13, 0b0000000001011 },
+ { 12, 0, 11, 0b00001110110 },
+ { 12, 1, 10, 0b0001000100 },
+ { 12, 2, 9, 0b000011110 },
+ { 12, 3, 10, 0b0000110111 },
+ { 12, 4, 10, 0b0000110010 },
+ { 12, 5, 10, 0b0000101110 },
+ { 12, 6, 11, 0b00001001010 },
+ { 12, 7, 11, 0b00001000001 },
+ { 12, 8, 11, 0b00000110001 },
+ { 12, 9, 11, 0b00000100111 },
+ { 12, 10, 11, 0b00000011000 },
+ { 12, 11, 11, 0b00000010000 },
+ { 12, 12, 12, 0b000000010110 },
+ { 12, 13, 12, 0b000000001101 },
+ { 12, 14, 13, 0b0000000001110 },
+ { 12, 15, 13, 0b0000000000111 },
+ { 13, 0, 11, 0b00001011011 },
+ { 13, 1, 10, 0b0000101100 },
+ { 13, 2, 10, 0b0000100111 },
+ { 13, 3, 10, 0b0000100110 },
+ { 13, 4, 10, 0b0000100010 },
+ { 13, 5, 11, 0b00000111111 },
+ { 13, 6, 11, 0b00000110100 },
+ { 13, 7, 11, 0b00000101101 },
+ { 13, 8, 11, 0b00000011111 },
+ { 13, 9, 12, 0b000000110100 },
+ { 13, 10, 12, 0b000000011100 },
+ { 13, 11, 12, 0b000000010011 },
+ { 13, 12, 12, 0b000000001110 },
+ { 13, 13, 12, 0b000000001000 },
+ { 13, 14, 13, 0b0000000001001 },
+ { 13, 15, 13, 0b0000000000011 },
+ { 14, 0, 12, 0b000001111011 },
+ { 14, 1, 11, 0b00000111100 },
+ { 14, 2, 11, 0b00000111010 },
+ { 14, 3, 11, 0b00000110101 },
+ { 14, 4, 11, 0b00000101111 },
+ { 14, 5, 11, 0b00000101011 },
+ { 14, 6, 11, 0b00000100000 },
+ { 14, 7, 11, 0b00000010110 },
+ { 14, 8, 12, 0b000000100101 },
+ { 14, 9, 12, 0b000000011000 },
+ { 14, 10, 12, 0b000000010001 },
+ { 14, 11, 12, 0b000000001100 },
+ { 14, 12, 13, 0b0000000001111 },
+ { 14, 13, 13, 0b0000000001010 },
+ { 14, 14, 12, 0b000000000010 },
+ { 14, 15, 13, 0b0000000000001 },
+ { 15, 0, 12, 0b000001000111 },
+ { 15, 1, 11, 0b00000100101 },
+ { 15, 2, 11, 0b00000100010 },
+ { 15, 3, 11, 0b00000011110 },
+ { 15, 4, 11, 0b00000011100 },
+ { 15, 5, 11, 0b00000010100 },
+ { 15, 6, 11, 0b00000010001 },
+ { 15, 7, 12, 0b000000011010 },
+ { 15, 8, 12, 0b000000010101 },
+ { 15, 9, 12, 0b000000010000 },
+ { 15, 10, 12, 0b000000001010 },
+ { 15, 11, 12, 0b000000000110 },
+ { 15, 12, 13, 0b0000000001000 },
+ { 15, 13, 13, 0b0000000000110 },
+ { 15, 14, 13, 0b0000000000010 },
+ { 15, 15, 13, 0b0000000000000 },
+} };
+
+constexpr HuffmanEntries<HuffmanEntryXY, 256> Table16 { {
+ { 0, 0, 1, 0b1 },
+ { 0, 1, 4, 0b0101 },
+ { 0, 2, 6, 0b001110 },
+ { 0, 3, 8, 0b00101100 },
+ { 0, 4, 9, 0b001001010 },
+ { 0, 5, 9, 0b000111111 },
+ { 0, 6, 10, 0b0001101110 },
+ { 0, 7, 10, 0b0001011101 },
+ { 0, 8, 11, 0b00010101100 },
+ { 0, 9, 11, 0b00010010101 },
+ { 0, 10, 11, 0b00010001010 },
+ { 0, 11, 12, 0b000011110010 },
+ { 0, 12, 12, 0b000011100001 },
+ { 0, 13, 12, 0b000011000011 },
+ { 0, 14, 13, 0b0000101111000 },
+ { 0, 15, 9, 0b000010001 },
+ { 1, 0, 3, 0b011 },
+ { 1, 1, 4, 0b0100 },
+ { 1, 2, 6, 0b001100 },
+ { 1, 3, 7, 0b0010100 },
+ { 1, 4, 8, 0b00100011 },
+ { 1, 5, 9, 0b000111110 },
+ { 1, 6, 9, 0b000110101 },
+ { 1, 7, 9, 0b000101111 },
+ { 1, 8, 10, 0b0001010011 },
+ { 1, 9, 10, 0b0001001011 },
+ { 1, 10, 10, 0b0001000100 },
+ { 1, 11, 11, 0b00001110111 },
+ { 1, 12, 12, 0b000011001001 },
+ { 1, 13, 11, 0b00001101011 },
+ { 1, 14, 12, 0b000011001111 },
+ { 1, 15, 8, 0b00001001 },
+ { 2, 0, 6, 0b001111 },
+ { 2, 1, 6, 0b001101 },
+ { 2, 2, 7, 0b0010111 },
+ { 2, 3, 8, 0b00100110 },
+ { 2, 4, 9, 0b001000011 },
+ { 2, 5, 9, 0b000111010 },
+ { 2, 6, 10, 0b0001100111 },
+ { 2, 7, 10, 0b0001011010 },
+ { 2, 8, 11, 0b00010100001 },
+ { 2, 9, 10, 0b0001001000 },
+ { 2, 10, 11, 0b00001111111 },
+ { 2, 11, 11, 0b00001110101 },
+ { 2, 12, 11, 0b00001101110 },
+ { 2, 13, 12, 0b000011010001 },
+ { 2, 14, 12, 0b000011001110 },
+ { 2, 15, 9, 0b000010000 },
+ { 3, 0, 8, 0b00101101 },
+ { 3, 1, 7, 0b0010101 },
+ { 3, 2, 8, 0b00100111 },
+ { 3, 3, 9, 0b001000101 },
+ { 3, 4, 9, 0b001000000 },
+ { 3, 5, 10, 0b0001110010 },
+ { 3, 6, 10, 0b0001100011 },
+ { 3, 7, 10, 0b0001010111 },
+ { 3, 8, 11, 0b00010011110 },
+ { 3, 9, 11, 0b00010001100 },
+ { 3, 10, 12, 0b000011111100 },
+ { 3, 11, 12, 0b000011010100 },
+ { 3, 12, 12, 0b000011000111 },
+ { 3, 13, 13, 0b0000110000011 },
+ { 3, 14, 13, 0b0000101101101 },
+ { 3, 15, 10, 0b0000011010 },
+ { 4, 0, 9, 0b001001011 },
+ { 4, 1, 8, 0b00100100 },
+ { 4, 2, 9, 0b001000100 },
+ { 4, 3, 9, 0b001000001 },
+ { 4, 4, 10, 0b0001110011 },
+ { 4, 5, 10, 0b0001100101 },
+ { 4, 6, 11, 0b00010110011 },
+ { 4, 7, 11, 0b00010100100 },
+ { 4, 8, 11, 0b00010011011 },
+ { 4, 9, 12, 0b000100001000 },
+ { 4, 10, 12, 0b000011110110 },
+ { 4, 11, 12, 0b000011100010 },
+ { 4, 12, 13, 0b0000110001011 },
+ { 4, 13, 13, 0b0000101111110 },
+ { 4, 14, 13, 0b0000101101010 },
+ { 4, 15, 9, 0b000001001 },
+ { 5, 0, 9, 0b001000010 },
+ { 5, 1, 8, 0b00011110 },
+ { 5, 2, 9, 0b000111011 },
+ { 5, 3, 9, 0b000111000 },
+ { 5, 4, 10, 0b0001100110 },
+ { 5, 5, 11, 0b00010111001 },
+ { 5, 6, 11, 0b00010101101 },
+ { 5, 7, 12, 0b000100001001 },
+ { 5, 8, 11, 0b00010001110 },
+ { 5, 9, 12, 0b000011111101 },
+ { 5, 10, 12, 0b000011101000 },
+ { 5, 11, 13, 0b0000110010000 },
+ { 5, 12, 13, 0b0000110000100 },
+ { 5, 13, 13, 0b0000101111010 },
+ { 5, 14, 14, 0b00000110111101 },
+ { 5, 15, 10, 0b0000010000 },
+ { 6, 0, 10, 0b0001101111 },
+ { 6, 1, 9, 0b000110110 },
+ { 6, 2, 9, 0b000110100 },
+ { 6, 3, 10, 0b0001100100 },
+ { 6, 4, 11, 0b00010111000 },
+ { 6, 5, 11, 0b00010110010 },
+ { 6, 6, 11, 0b00010100000 },
+ { 6, 7, 11, 0b00010000101 },
+ { 6, 8, 12, 0b000100000001 },
+ { 6, 9, 12, 0b000011110100 },
+ { 6, 10, 12, 0b000011100100 },
+ { 6, 11, 12, 0b000011011001 },
+ { 6, 12, 13, 0b0000110000001 },
+ { 6, 13, 13, 0b0000101101110 },
+ { 6, 14, 14, 0b00001011001011 },
+ { 6, 15, 10, 0b0000001010 },
+ { 7, 0, 10, 0b0001100010 },
+ { 7, 1, 9, 0b000110000 },
+ { 7, 2, 10, 0b0001011011 },
+ { 7, 3, 10, 0b0001011000 },
+ { 7, 4, 11, 0b00010100101 },
+ { 7, 5, 11, 0b00010011101 },
+ { 7, 6, 11, 0b00010010100 },
+ { 7, 7, 12, 0b000100000101 },
+ { 7, 8, 12, 0b000011111000 },
+ { 7, 9, 13, 0b0000110010111 },
+ { 7, 10, 13, 0b0000110001101 },
+ { 7, 11, 13, 0b0000101110100 },
+ { 7, 12, 13, 0b0000101111100 },
+ { 7, 13, 15, 0b000001101111001 },
+ { 7, 14, 15, 0b000001101110100 },
+ { 7, 15, 10, 0b0000001000 },
+ { 8, 0, 10, 0b0001010101 },
+ { 8, 1, 10, 0b0001010100 },
+ { 8, 2, 10, 0b0001010001 },
+ { 8, 3, 11, 0b00010011111 },
+ { 8, 4, 11, 0b00010011100 },
+ { 8, 5, 11, 0b00010001111 },
+ { 8, 6, 12, 0b000100000100 },
+ { 8, 7, 12, 0b000011111001 },
+ { 8, 8, 13, 0b0000110101011 },
+ { 8, 9, 13, 0b0000110010001 },
+ { 8, 10, 13, 0b0000110001000 },
+ { 8, 11, 13, 0b0000101111111 },
+ { 8, 12, 14, 0b00001011010111 },
+ { 8, 13, 14, 0b00001011001001 },
+ { 8, 14, 14, 0b00001011000100 },
+ { 8, 15, 10, 0b0000000111 },
+ { 9, 0, 11, 0b00010011010 },
+ { 9, 1, 10, 0b0001001100 },
+ { 9, 2, 10, 0b0001001001 },
+ { 9, 3, 11, 0b00010001101 },
+ { 9, 4, 11, 0b00010000011 },
+ { 9, 5, 12, 0b000100000000 },
+ { 9, 6, 12, 0b000011110101 },
+ { 9, 7, 13, 0b0000110101010 },
+ { 9, 8, 13, 0b0000110010110 },
+ { 9, 9, 13, 0b0000110001010 },
+ { 9, 10, 13, 0b0000110000000 },
+ { 9, 11, 14, 0b00001011011111 },
+ { 9, 12, 13, 0b0000101100111 },
+ { 9, 13, 14, 0b00001011000110 },
+ { 9, 14, 13, 0b0000101100000 },
+ { 9, 15, 11, 0b00000001011 },
+ { 10, 0, 11, 0b00010001011 },
+ { 10, 1, 11, 0b00010000001 },
+ { 10, 2, 10, 0b0001000011 },
+ { 10, 3, 11, 0b00001111101 },
+ { 10, 4, 12, 0b000011110111 },
+ { 10, 5, 12, 0b000011101001 },
+ { 10, 6, 12, 0b000011100101 },
+ { 10, 7, 12, 0b000011011011 },
+ { 10, 8, 13, 0b0000110001001 },
+ { 10, 9, 14, 0b00001011100111 },
+ { 10, 10, 14, 0b00001011100001 },
+ { 10, 11, 14, 0b00001011010000 },
+ { 10, 12, 15, 0b000001101110101 },
+ { 10, 13, 15, 0b000001101110010 },
+ { 10, 14, 14, 0b00000110110111 },
+ { 10, 15, 10, 0b0000000100 },
+ { 11, 0, 12, 0b000011110011 },
+ { 11, 1, 11, 0b00001111000 },
+ { 11, 2, 11, 0b00001110110 },
+ { 11, 3, 11, 0b00001110011 },
+ { 11, 4, 12, 0b000011100011 },
+ { 11, 5, 12, 0b000011011111 },
+ { 11, 6, 13, 0b0000110001100 },
+ { 11, 7, 14, 0b00001011101010 },
+ { 11, 8, 14, 0b00001011100110 },
+ { 11, 9, 14, 0b00001011100000 },
+ { 11, 10, 14, 0b00001011010001 },
+ { 11, 11, 14, 0b00001011001000 },
+ { 11, 12, 14, 0b00001011000010 },
+ { 11, 13, 13, 0b0000011011111 },
+ { 11, 14, 14, 0b00000110110100 },
+ { 11, 15, 11, 0b00000000110 },
+ { 12, 0, 12, 0b000011001010 },
+ { 12, 1, 12, 0b000011100000 },
+ { 12, 2, 12, 0b000011011110 },
+ { 12, 3, 12, 0b000011011010 },
+ { 12, 4, 12, 0b000011011000 },
+ { 12, 5, 13, 0b0000110000101 },
+ { 12, 6, 13, 0b0000110000010 },
+ { 12, 7, 13, 0b0000101111101 },
+ { 12, 8, 13, 0b0000101101100 },
+ { 12, 9, 15, 0b000001101111000 },
+ { 12, 10, 14, 0b00000110111011 },
+ { 12, 11, 14, 0b00001011000011 },
+ { 12, 12, 14, 0b00000110111000 },
+ { 12, 13, 14, 0b00000110110101 },
+ { 12, 14, 16, 0b0000011011000000 },
+ { 12, 15, 11, 0b00000000100 },
+ { 13, 0, 14, 0b00001011101011 },
+ { 13, 1, 12, 0b000011010011 },
+ { 13, 2, 12, 0b000011010010 },
+ { 13, 3, 12, 0b000011010000 },
+ { 13, 4, 13, 0b0000101110010 },
+ { 13, 5, 13, 0b0000101111011 },
+ { 13, 6, 14, 0b00001011011110 },
+ { 13, 7, 14, 0b00001011010011 },
+ { 13, 8, 14, 0b00001011001010 },
+ { 13, 9, 16, 0b0000011011000111 },
+ { 13, 10, 15, 0b000001101110011 },
+ { 13, 11, 15, 0b000001101101101 },
+ { 13, 12, 15, 0b000001101101100 },
+ { 13, 13, 17, 0b00000110110000011 },
+ { 13, 14, 15, 0b000001101100001 },
+ { 13, 15, 11, 0b00000000010 },
+ { 14, 0, 13, 0b0000101111001 },
+ { 14, 1, 13, 0b0000101110001 },
+ { 14, 2, 11, 0b00001100110 },
+ { 14, 3, 12, 0b000010111011 },
+ { 14, 4, 14, 0b00001011010110 },
+ { 14, 5, 14, 0b00001011010010 },
+ { 14, 6, 13, 0b0000101100110 },
+ { 14, 7, 14, 0b00001011000111 },
+ { 14, 8, 14, 0b00001011000101 },
+ { 14, 9, 15, 0b000001101100010 },
+ { 14, 10, 16, 0b0000011011000110 },
+ { 14, 11, 15, 0b000001101100111 },
+ { 14, 12, 17, 0b00000110110000010 },
+ { 14, 13, 15, 0b000001101100110 },
+ { 14, 14, 14, 0b00000110110010 },
+ { 14, 15, 11, 0b00000000000 },
+ { 15, 0, 9, 0b000001100 },
+ { 15, 1, 8, 0b00001010 },
+ { 15, 2, 8, 0b00000111 },
+ { 15, 3, 9, 0b000001011 },
+ { 15, 4, 9, 0b000001010 },
+ { 15, 5, 10, 0b0000010001 },
+ { 15, 6, 10, 0b0000001011 },
+ { 15, 7, 10, 0b0000001001 },
+ { 15, 8, 11, 0b00000001101 },
+ { 15, 9, 11, 0b00000001100 },
+ { 15, 10, 11, 0b00000001010 },
+ { 15, 11, 11, 0b00000000111 },
+ { 15, 12, 11, 0b00000000101 },
+ { 15, 13, 11, 0b00000000011 },
+ { 15, 14, 11, 0b00000000001 },
+ { 15, 15, 8, 0b00000011 },
+} };
+
+constexpr HuffmanEntries<HuffmanEntryXY, 256> Table17 { Table16 };
+constexpr HuffmanEntries<HuffmanEntryXY, 256> Table18 { Table16 };
+constexpr HuffmanEntries<HuffmanEntryXY, 256> Table19 { Table16 };
+constexpr HuffmanEntries<HuffmanEntryXY, 256> Table20 { Table16 };
+constexpr HuffmanEntries<HuffmanEntryXY, 256> Table21 { Table16 };
+constexpr HuffmanEntries<HuffmanEntryXY, 256> Table22 { Table16 };
+constexpr HuffmanEntries<HuffmanEntryXY, 256> Table23 { Table16 };
+
+constexpr HuffmanEntries<HuffmanEntryXY, 256> Table24 { {
+ { 0, 0, 4, 0b1111 },
+ { 0, 1, 4, 0b1101 },
+ { 0, 2, 6, 0b101110 },
+ { 0, 3, 7, 0b1010000 },
+ { 0, 4, 8, 0b10010010 },
+ { 0, 5, 9, 0b100000110 },
+ { 0, 6, 9, 0b011111000 },
+ { 0, 7, 10, 0b0110110010 },
+ { 0, 8, 10, 0b0110101010 },
+ { 0, 9, 11, 0b01010011101 },
+ { 0, 10, 11, 0b01010001101 },
+ { 0, 11, 11, 0b01010001001 },
+ { 0, 12, 11, 0b01001101101 },
+ { 0, 13, 11, 0b01000000101 },
+ { 0, 14, 12, 0b010000001000 },
+ { 0, 15, 9, 0b001011000 },
+ { 1, 0, 4, 0b1110 },
+ { 1, 1, 4, 0b1100 },
+ { 1, 2, 5, 0b10101 },
+ { 1, 3, 6, 0b100110 },
+ { 1, 4, 7, 0b1000111 },
+ { 1, 5, 8, 0b10000010 },
+ { 1, 6, 8, 0b01111010 },
+ { 1, 7, 9, 0b011011000 },
+ { 1, 8, 9, 0b011010001 },
+ { 1, 9, 9, 0b011000110 },
+ { 1, 10, 10, 0b0101000111 },
+ { 1, 11, 10, 0b0101011001 },
+ { 1, 12, 10, 0b0100111111 },
+ { 1, 13, 10, 0b0100101001 },
+ { 1, 14, 10, 0b0100010111 },
+ { 1, 15, 8, 0b00101010 },
+ { 2, 0, 6, 0b101111 },
+ { 2, 1, 5, 0b10110 },
+ { 2, 2, 6, 0b101001 },
+ { 2, 3, 7, 0b1001010 },
+ { 2, 4, 7, 0b1000100 },
+ { 2, 5, 8, 0b10000000 },
+ { 2, 6, 8, 0b01111000 },
+ { 2, 7, 9, 0b011011101 },
+ { 2, 8, 9, 0b011001111 },
+ { 2, 9, 9, 0b011000010 },
+ { 2, 10, 9, 0b010110110 },
+ { 2, 11, 10, 0b0101010100 },
+ { 2, 12, 10, 0b0100111011 },
+ { 2, 13, 10, 0b0100100111 },
+ { 2, 14, 11, 0b01000011101 },
+ { 2, 15, 7, 0b0010010 },
+ { 3, 0, 7, 0b1010001 },
+ { 3, 1, 6, 0b100111 },
+ { 3, 2, 7, 0b1001011 },
+ { 3, 3, 7, 0b1000110 },
+ { 3, 4, 8, 0b10000110 },
+ { 3, 5, 8, 0b01111101 },
+ { 3, 6, 8, 0b01110100 },
+ { 3, 7, 9, 0b011011100 },
+ { 3, 8, 9, 0b011001100 },
+ { 3, 9, 9, 0b010111110 },
+ { 3, 10, 9, 0b010110010 },
+ { 3, 11, 10, 0b0101000101 },
+ { 3, 12, 10, 0b0100110111 },
+ { 3, 13, 10, 0b0100100101 },
+ { 3, 14, 10, 0b0100001111 },
+ { 3, 15, 7, 0b0010000 },
+ { 4, 0, 8, 0b10010011 },
+ { 4, 1, 7, 0b1001000 },
+ { 4, 2, 7, 0b1000101 },
+ { 4, 3, 8, 0b10000111 },
+ { 4, 4, 8, 0b01111111 },
+ { 4, 5, 8, 0b01110110 },
+ { 4, 6, 8, 0b01110000 },
+ { 4, 7, 9, 0b011010010 },
+ { 4, 8, 9, 0b011001000 },
+ { 4, 9, 9, 0b010111100 },
+ { 4, 10, 10, 0b0101100000 },
+ { 4, 11, 10, 0b0101000011 },
+ { 4, 12, 10, 0b0100110010 },
+ { 4, 13, 10, 0b0100011101 },
+ { 4, 14, 11, 0b01000011100 },
+ { 4, 15, 7, 0b0001110 },
+ { 5, 0, 9, 0b100000111 },
+ { 5, 1, 7, 0b1000010 },
+ { 5, 2, 8, 0b10000001 },
+ { 5, 3, 8, 0b01111110 },
+ { 5, 4, 8, 0b01110111 },
+ { 5, 5, 8, 0b01110010 },
+ { 5, 6, 9, 0b011010110 },
+ { 5, 7, 9, 0b011001010 },
+ { 5, 8, 9, 0b011000000 },
+ { 5, 9, 9, 0b010110100 },
+ { 5, 10, 10, 0b0101010101 },
+ { 5, 11, 10, 0b0100111101 },
+ { 5, 12, 10, 0b0100101101 },
+ { 5, 13, 10, 0b0100011001 },
+ { 5, 14, 10, 0b0100000110 },
+ { 5, 15, 7, 0b0001100 },
+ { 6, 0, 9, 0b011111001 },
+ { 6, 1, 8, 0b01111011 },
+ { 6, 2, 8, 0b01111001 },
+ { 6, 3, 8, 0b01110101 },
+ { 6, 4, 8, 0b01110001 },
+ { 6, 5, 9, 0b011010111 },
+ { 6, 6, 9, 0b011001110 },
+ { 6, 7, 9, 0b011000011 },
+ { 6, 8, 9, 0b010111001 },
+ { 6, 9, 10, 0b0101011011 },
+ { 6, 10, 10, 0b0101001010 },
+ { 6, 11, 10, 0b0100110100 },
+ { 6, 12, 10, 0b0100100011 },
+ { 6, 13, 10, 0b0100010000 },
+ { 6, 14, 11, 0b01000001000 },
+ { 6, 15, 7, 0b0001010 },
+ { 7, 0, 10, 0b0110110011 },
+ { 7, 1, 8, 0b01110011 },
+ { 7, 2, 8, 0b01101111 },
+ { 7, 3, 8, 0b01101101 },
+ { 7, 4, 9, 0b011010011 },
+ { 7, 5, 9, 0b011001011 },
+ { 7, 6, 9, 0b011000100 },
+ { 7, 7, 9, 0b010111011 },
+ { 7, 8, 10, 0b0101100001 },
+ { 7, 9, 10, 0b0101001100 },
+ { 7, 10, 10, 0b0100111001 },
+ { 7, 11, 10, 0b0100101010 },
+ { 7, 12, 10, 0b0100011011 },
+ { 7, 13, 11, 0b01000010011 },
+ { 7, 14, 11, 0b00101111101 },
+ { 7, 15, 8, 0b00010001 },
+ { 8, 0, 10, 0b0110101011 },
+ { 8, 1, 9, 0b011010100 },
+ { 8, 2, 9, 0b011010000 },
+ { 8, 3, 9, 0b011001101 },
+ { 8, 4, 9, 0b011001001 },
+ { 8, 5, 9, 0b011000001 },
+ { 8, 6, 9, 0b010111010 },
+ { 8, 7, 9, 0b010110001 },
+ { 8, 8, 9, 0b010101001 },
+ { 8, 9, 10, 0b0101000000 },
+ { 8, 10, 10, 0b0100101111 },
+ { 8, 11, 10, 0b0100011110 },
+ { 8, 12, 10, 0b0100001100 },
+ { 8, 13, 11, 0b01000000010 },
+ { 8, 14, 11, 0b00101111001 },
+ { 8, 15, 8, 0b00010000 },
+ { 9, 0, 10, 0b0101001111 },
+ { 9, 1, 9, 0b011000111 },
+ { 9, 2, 9, 0b011000101 },
+ { 9, 3, 9, 0b010111111 },
+ { 9, 4, 9, 0b010111101 },
+ { 9, 5, 9, 0b010110101 },
+ { 9, 6, 9, 0b010101110 },
+ { 9, 7, 10, 0b0101001101 },
+ { 9, 8, 10, 0b0101000001 },
+ { 9, 9, 10, 0b0100110001 },
+ { 9, 10, 10, 0b0100100001 },
+ { 9, 11, 10, 0b0100010011 },
+ { 9, 12, 11, 0b01000001001 },
+ { 9, 13, 11, 0b00101111011 },
+ { 9, 14, 11, 0b00101110011 },
+ { 9, 15, 8, 0b00001011 },
+ { 10, 0, 11, 0b01010011100 },
+ { 10, 1, 9, 0b010111000 },
+ { 10, 2, 9, 0b010110111 },
+ { 10, 3, 9, 0b010110011 },
+ { 10, 4, 9, 0b010101111 },
+ { 10, 5, 10, 0b0101011000 },
+ { 10, 6, 10, 0b0101001011 },
+ { 10, 7, 10, 0b0100111010 },
+ { 10, 8, 10, 0b0100110000 },
+ { 10, 9, 10, 0b0100100010 },
+ { 10, 10, 10, 0b0100010101 },
+ { 10, 11, 11, 0b01000010010 },
+ { 10, 12, 11, 0b00101111111 },
+ { 10, 13, 11, 0b00101110101 },
+ { 10, 14, 11, 0b00101101110 },
+ { 10, 15, 8, 0b00001010 },
+ { 11, 0, 11, 0b01010001100 },
+ { 11, 1, 10, 0b0101011010 },
+ { 11, 2, 9, 0b010101011 },
+ { 11, 3, 9, 0b010101000 },
+ { 11, 4, 9, 0b010100100 },
+ { 11, 5, 10, 0b0100111110 },
+ { 11, 6, 10, 0b0100110101 },
+ { 11, 7, 10, 0b0100101011 },
+ { 11, 8, 10, 0b0100011111 },
+ { 11, 9, 10, 0b0100010100 },
+ { 11, 10, 10, 0b0100000111 },
+ { 11, 11, 11, 0b01000000001 },
+ { 11, 12, 11, 0b00101110111 },
+ { 11, 13, 11, 0b00101110000 },
+ { 11, 14, 11, 0b00101101010 },
+ { 11, 15, 8, 0b00000110 },
+ { 12, 0, 11, 0b01010001000 },
+ { 12, 1, 10, 0b0101000010 },
+ { 12, 2, 10, 0b0100111100 },
+ { 12, 3, 10, 0b0100111000 },
+ { 12, 4, 10, 0b0100110011 },
+ { 12, 5, 10, 0b0100101110 },
+ { 12, 6, 10, 0b0100100100 },
+ { 12, 7, 10, 0b0100011100 },
+ { 12, 8, 10, 0b0100001101 },
+ { 12, 9, 10, 0b0100000101 },
+ { 12, 10, 11, 0b01000000000 },
+ { 12, 11, 11, 0b00101111000 },
+ { 12, 12, 11, 0b00101110010 },
+ { 12, 13, 11, 0b00101101100 },
+ { 12, 14, 11, 0b00101100111 },
+ { 12, 15, 8, 0b00000100 },
+ { 13, 0, 11, 0b01001101100 },
+ { 13, 1, 10, 0b0100101100 },
+ { 13, 2, 10, 0b0100101000 },
+ { 13, 3, 10, 0b0100100110 },
+ { 13, 4, 10, 0b0100100000 },
+ { 13, 5, 10, 0b0100011010 },
+ { 13, 6, 10, 0b0100010001 },
+ { 13, 7, 10, 0b0100001010 },
+ { 13, 8, 11, 0b01000000011 },
+ { 13, 9, 11, 0b00101111100 },
+ { 13, 10, 11, 0b00101110110 },
+ { 13, 11, 11, 0b00101110001 },
+ { 13, 12, 11, 0b00101101101 },
+ { 13, 13, 11, 0b00101101001 },
+ { 13, 14, 11, 0b00101100101 },
+ { 13, 15, 8, 0b00000010 },
+ { 14, 0, 12, 0b010000001001 },
+ { 14, 1, 10, 0b0100011000 },
+ { 14, 2, 10, 0b0100010110 },
+ { 14, 3, 10, 0b0100010010 },
+ { 14, 4, 10, 0b0100001011 },
+ { 14, 5, 10, 0b0100001000 },
+ { 14, 6, 10, 0b0100000011 },
+ { 14, 7, 11, 0b00101111110 },
+ { 14, 8, 11, 0b00101111010 },
+ { 14, 9, 11, 0b00101110100 },
+ { 14, 10, 11, 0b00101101111 },
+ { 14, 11, 11, 0b00101101011 },
+ { 14, 12, 11, 0b00101101000 },
+ { 14, 13, 11, 0b00101100110 },
+ { 14, 14, 11, 0b00101100100 },
+ { 14, 15, 8, 0b00000000 },
+ { 15, 0, 8, 0b00101011 },
+ { 15, 1, 7, 0b0010100 },
+ { 15, 2, 7, 0b0010011 },
+ { 15, 3, 7, 0b0010001 },
+ { 15, 4, 7, 0b0001111 },
+ { 15, 5, 7, 0b0001101 },
+ { 15, 6, 7, 0b0001011 },
+ { 15, 7, 7, 0b0001001 },
+ { 15, 8, 7, 0b0000111 },
+ { 15, 9, 7, 0b0000110 },
+ { 15, 10, 7, 0b0000100 },
+ { 15, 11, 8, 0b00000111 },
+ { 15, 12, 8, 0b00000101 },
+ { 15, 13, 8, 0b00000011 },
+ { 15, 14, 8, 0b00000001 },
+ { 15, 15, 4, 0b0011 },
+} };
+
+constexpr HuffmanEntries<HuffmanEntryXY, 256> Table25 { Table24 };
+constexpr HuffmanEntries<HuffmanEntryXY, 256> Table26 { Table24 };
+constexpr HuffmanEntries<HuffmanEntryXY, 256> Table27 { Table24 };
+constexpr HuffmanEntries<HuffmanEntryXY, 256> Table28 { Table24 };
+constexpr HuffmanEntries<HuffmanEntryXY, 256> Table29 { Table24 };
+constexpr HuffmanEntries<HuffmanEntryXY, 256> Table30 { Table24 };
+constexpr HuffmanEntries<HuffmanEntryXY, 256> Table31 { Table24 };
+
+constexpr auto TreeA = make_huffman_tree<TableA>();
+constexpr auto TreeB = make_huffman_tree<TableB>();
+
+constexpr auto Tree0 = make_huffman_tree<Table0>();
+constexpr auto Tree1 = make_huffman_tree<Table1>();
+constexpr auto Tree2 = make_huffman_tree<Table2>();
+constexpr auto Tree3 = make_huffman_tree<Table3>();
+constexpr auto Tree5 = make_huffman_tree<Table5>();
+constexpr auto Tree6 = make_huffman_tree<Table6>();
+constexpr auto Tree7 = make_huffman_tree<Table7>();
+constexpr auto Tree8 = make_huffman_tree<Table8>();
+constexpr auto Tree9 = make_huffman_tree<Table9>();
+constexpr auto Tree10 = make_huffman_tree<Table10>();
+constexpr auto Tree11 = make_huffman_tree<Table11>();
+constexpr auto Tree12 = make_huffman_tree<Table12>();
+constexpr auto Tree13 = make_huffman_tree<Table13>();
+constexpr auto Tree15 = make_huffman_tree<Table15>();
+constexpr auto Tree16 = make_huffman_tree<Table16>();
+constexpr auto Tree17 = make_huffman_tree<Table17>();
+constexpr auto Tree18 = make_huffman_tree<Table18>();
+constexpr auto Tree19 = make_huffman_tree<Table19>();
+constexpr auto Tree20 = make_huffman_tree<Table20>();
+constexpr auto Tree21 = make_huffman_tree<Table21>();
+constexpr auto Tree22 = make_huffman_tree<Table22>();
+constexpr auto Tree23 = make_huffman_tree<Table23>();
+constexpr auto Tree24 = make_huffman_tree<Table24>();
+constexpr auto Tree25 = make_huffman_tree<Table25>();
+constexpr auto Tree26 = make_huffman_tree<Table26>();
+constexpr auto Tree27 = make_huffman_tree<Table27>();
+constexpr auto Tree28 = make_huffman_tree<Table28>();
+constexpr auto Tree29 = make_huffman_tree<Table29>();
+constexpr auto Tree30 = make_huffman_tree<Table30>();
+constexpr auto Tree31 = make_huffman_tree<Table31>();
+
+struct HuffmanTreeXY {
+ Span<HuffmanNode<HuffmanXY> const> nodes;
+ int linbits;
+};
+
+Array<HuffmanTreeXY const, 32> HuffmanTreesXY { {
+ { Tree0, 0 },
+ { Tree1, 0 },
+ { Tree2, 0 },
+ { Tree3, 0 },
+ { {}, 0 },
+ { Tree5, 0 },
+ { Tree6, 0 },
+ { Tree7, 0 },
+ { Tree8, 0 },
+ { Tree9, 0 },
+ { Tree10, 0 },
+ { Tree11, 0 },
+ { Tree12, 0 },
+ { Tree13, 0 },
+ { {}, 0 },
+ { Tree15, 0 },
+ { Tree16, 1 },
+ { Tree17, 2 },
+ { Tree18, 3 },
+ { Tree19, 4 },
+ { Tree20, 6 },
+ { Tree21, 8 },
+ { Tree22, 10 },
+ { Tree23, 13 },
+ { Tree24, 4 },
+ { Tree25, 5 },
+ { Tree26, 6 },
+ { Tree27, 7 },
+ { Tree28, 8 },
+ { Tree29, 9 },
+ { Tree30, 11 },
+ { Tree31, 13 },
+} };
+
+}