automate registry data extraction

This commit is contained in:
p2r3
2025-08-13 16:03:19 +03:00
parent 36836fa33f
commit 5769a8552b
7 changed files with 230 additions and 4829 deletions

2
.gitignore vendored
View File

@@ -1,3 +1,5 @@
.vscode
notchian
bareiron
src/registries.c
src/registries.h

227
build_registries.js Normal file
View File

@@ -0,0 +1,227 @@
const fs = require("fs/promises");
const path = require("path");
// Extract item and block data from registry dump
async function extractItemsAndBlocks () {
// Block network IDs are defined in their own JSON file
const blockSource = JSON.parse(await fs.readFile(`${__dirname}/notchian/generated/reports/blocks.json`, "utf8"));
// Items don't seem to have network IDs outside of registries.json
const itemSource = JSON.parse(await fs.readFile(`${__dirname}/notchian/generated/reports/registries.json`, "utf8"))["minecraft:item"].entries;
// Sort blocks by their network ID
// Since we're only storing 256 blocks, this prioritizes the "common" ones first
const sortedBlocks = Object.entries(blockSource);
sortedBlocks.sort((a, b) => {
const aState = a[1].states.find(c => c.default);
if (!aState) return 1;
const bState = b[1].states.find(c => c.default);
if (!bState) return -1;
return aState.id - bState.id;
});
// Create name-id pair objects for easier parsing
const blocks = {}, items = {};
for (const entry of sortedBlocks) {
const defaultState = entry[1].states.find(c => c.default);
if (!defaultState) continue;
blocks[entry[0].replace("minecraft:", "")] = defaultState.id;
}
for (const item in itemSource) {
items[item.replace("minecraft:", "")] = itemSource[item].protocol_id;
}
/**
* Create a block network ID palette.
* The goal is to pack as many meaningful blocks into 256 IDs as
* possible. For this, we only include blocks that have corresponding
* items, outside of some exceptions.
*/
const palette = {};
const exceptions = [ "air", "water", "lava" ];
// While we're at it, map block IDs to item IDs
const mapping = [];
for (const block in blocks) {
if (!(block in items) && !exceptions.includes(block)) continue;
palette[block] = blocks[block];
mapping.push(items[block] || 0);
if (mapping.length === 256) break;
}
return { blocks, items, palette, mapping };
}
// Write an integer as a VarInt
function writeVarInt (value) {
const bytes = [];
while (true) {
if ((value & ~0x7F) === 0) {
bytes.push(value);
return Buffer.from(bytes);
}
bytes.push((value & 0x7F) | 0x80);
value >>>= 7;
}
}
// Scan directory recursively to find all JSON files
async function scanDirectory (basePath, currentPath = "") {
const entries = {};
const items = await fs.readdir(path.join(basePath, currentPath), { withFileTypes: true });
for (const item of items) {
const relativePath = path.join(currentPath, item.name);
if (item.isDirectory()) {
const subEntries = await scanDirectory(basePath, relativePath);
Object.assign(entries, subEntries);
} else if (item.name.endsWith(".json")) {
const dirPath = path.dirname(relativePath);
const registryName = dirPath === "." ? "" : dirPath;
const entryName = path.basename(item.name, ".json");
if (!entries[registryName]) {
entries[registryName] = [];
}
entries[registryName].push(entryName);
}
}
return entries;
}
// Serialize a single registry
function serializeRegistry (name, entries) {
const parts = [];
// Packet ID for Registry Data
parts.push(Buffer.from([0x07]));
// Registry name
const nameBuf = Buffer.from(name, "utf8");
parts.push(writeVarInt(nameBuf.length));
parts.push(nameBuf);
// Entry count
parts.push(writeVarInt(entries.length));
// Serialize entries
for (const entryName of entries) {
const entryBuf = Buffer.from(entryName, "utf8");
parts.push(writeVarInt(entryBuf.length));
parts.push(entryBuf);
parts.push(Buffer.from([0x00]));
}
// Combine all parts
const fullData = Buffer.concat(parts);
// Prepend packet length
const lengthBuf = writeVarInt(fullData.length);
return Buffer.concat([lengthBuf, fullData]);
}
// Convert to C-style hex byte array string
function toCArray (buffer) {
const hexBytes = [...buffer].map(b => `0x${b.toString(16).padStart(2, "0")}`);
const lines = [];
for (let i = 0; i < hexBytes.length; i += 12) {
lines.push(" " + hexBytes.slice(i, i + 12).join(", "));
}
return lines.join(",\n");
}
const requiredRegistries = [
"dimension_type",
"cat_variant",
"chicken_variant",
"cow_variant",
"frog_variant",
"painting_variant",
"pig_variant",
"wolf_sound_variant",
"wolf_variant",
"damage_type",
"worldgen/biome"
];
async function convert () {
const inputPath = __dirname + "/notchian/generated/data/minecraft";
const outputPath = __dirname + "/src/registries.c";
const headerPath = __dirname + "/src/registries.h";
const registries = await scanDirectory(inputPath);
const buffers = [];
for (const registry of requiredRegistries) {
if (!(registry in registries)) {
console.error(`Missing required registry "${registry}"!`);
return;
}
buffers.push(serializeRegistry(registry, registries[registry]));
}
const itemsAndBlocks = await extractItemsAndBlocks();
const output = Buffer.concat(buffers);
const cArray = toCArray(output);
const sourceCode = `\
#include <stdint.h>
#include "registries.h"
// Binary contents of required "Registry Data" packets
uint8_t registries_bin[] = {
${cArray}
};
// Block palette
uint16_t block_palette[] = { ${Object.values(itemsAndBlocks.palette).join(", ")} };
// Block-to-item mapping
uint16_t B_to_I[] = { ${itemsAndBlocks.mapping.join(", ")} };
// Item-to-block mapping
uint8_t I_to_B (uint16_t item) {
switch (item) {
${itemsAndBlocks.mapping.map((c, i) => c ? `case ${c}: return ${i};\n ` : "").join("")}
default: break;
}
return 0;
}
`;
const headerCode = `\
#ifndef H_REGISTRIES
#define H_REGISTRIES
#include <stdint.h>
extern uint8_t registries_bin[${output.length}];
extern uint16_t block_palette[256]; // Block palette
extern uint16_t B_to_I[256]; // Block-to-item mapping
uint8_t I_to_B (uint16_t item); // Item-to-block mapping
// Block identifiers
${Object.keys(itemsAndBlocks.palette).map((c, i) => `#define B_${c} ${i}`).join("\n")}
// Item identifiers
${Object.entries(itemsAndBlocks.items).map(c => `#define I_${c[0]} ${c[1]}`).join("\n")}
// Biome identifiers
${registries["worldgen/biome"].map((c, i) => `#define W_${c} ${i}`).join("\n")}
#endif
`;
await fs.writeFile(outputPath, sourceCode);
await fs.writeFile(headerPath, headerCode);
console.log("Done. Wrote to `registries.c` and `registries.h`");
}
convert().catch(console.error);

View File

@@ -1,101 +0,0 @@
const fs = require("fs");
const path = require("path");
// Write an integer as a varint
function writeVarInt(value) {
const bytes = [];
while (true) {
if ((value & ~0x7F) === 0) {
bytes.push(value);
return Buffer.from(bytes);
}
bytes.push((value & 0x7F) | 0x80);
value >>>= 7;
}
}
// Serialize a single registry
function serializeRegistry(name, entries) {
const parts = [];
// Write 0x07
parts.push(Buffer.from([0x07]));
// Registry name
const nameBuf = Buffer.from(name.replace("minecraft:", ""), "utf8");
parts.push(writeVarInt(nameBuf.length));
parts.push(nameBuf);
// Entry count
const entryKeys = Object.keys(entries);
parts.push(writeVarInt(entryKeys.length));
// Serialize entries
for (const entryName of entryKeys) {
const entryBuf = Buffer.from(entryName.replace("minecraft:", ""), "utf8");
parts.push(writeVarInt(entryBuf.length));
parts.push(entryBuf);
parts.push(Buffer.from([0x00]));
}
// Combine all parts
const fullData = Buffer.concat(parts);
// Prepend the length of this registry block as a varint
const lengthBuf = writeVarInt(fullData.length);
return Buffer.concat([lengthBuf, fullData]);
}
// Convert to C-style hex byte array string
function toCArray(buffer) {
const hexBytes = [...buffer].map(b => `0x${b.toString(16).padStart(2, "0")}`);
const lines = [];
for (let i = 0; i < hexBytes.length; i += 12) {
lines.push(" " + hexBytes.slice(i, i + 12).join(", "));
}
return lines.join(",\n");
}
// Main function
function convert() {
const inputPath = path.join(__dirname, "registries.json");
const outputPath = path.join(__dirname, "_registries.c");
const headerPath = path.join(__dirname, "_registries.h");
const json = JSON.parse(fs.readFileSync(inputPath, "utf8"));
const buffers = [];
for (const [registryName, entries] of Object.entries(json)) {
buffers.push(serializeRegistry(registryName, entries));
}
const output = Buffer.concat(buffers);
const cArray = toCArray(output);
const finalCode = `\
#include <stdint.h>
#include "registries.h"
uint8_t registries_bin[] = {
${cArray}
};
`;
const headerCode = `\
#ifndef H_REGISTRIES
#define H_REGISTRIES
#include <stdint.h>
extern uint8_t registries_bin[${output.length}];
#endif
`;
fs.writeFileSync(outputPath, finalCode);
fs.writeFileSync(headerPath, headerCode);
console.log("Done. Wrote to `_registries.c` and `_registries.h`");
}
convert();

View File

@@ -286,7 +286,7 @@ int sc_chunkDataAndUpdateLight (int client_fd, int _x, int _z) {
}
// biome data
writeByte(client_fd, 0); // bits per entry
writeByte(client_fd, 21); // palette (forest)
writeByte(client_fd, W_forest); // palette
}
writeVarInt(client_fd, 0); // omit block entities
@@ -572,26 +572,6 @@ int sc_registries (int client_fd) {
printf("Sending Registries\n\n");
send(client_fd, registries_bin, sizeof(registries_bin), 0);
char wolf_sound_variant[] = { 0x07, 0x1c, 0x6d, 0x69, 0x6e, 0x65, 0x63, 0x72, 0x61, 0x66, 0x74, 0x3a, 0x77, 0x6f, 0x6c, 0x66, 0x5f, 0x73, 0x6f, 0x75, 0x6e, 0x64, 0x5f, 0x76, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, 0x07, 0x0f, 0x6d, 0x69, 0x6e, 0x65, 0x63, 0x72, 0x61, 0x66, 0x74, 0x3a, 0x61, 0x6e, 0x67, 0x72, 0x79, 0x00, 0x0d, 0x6d, 0x69, 0x6e, 0x65, 0x63, 0x72, 0x61, 0x66, 0x74, 0x3a, 0x62, 0x69, 0x67, 0x00, 0x11, 0x6d, 0x69, 0x6e, 0x65, 0x63, 0x72, 0x61, 0x66, 0x74, 0x3a, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x69, 0x63, 0x00, 0x0e, 0x6d, 0x69, 0x6e, 0x65, 0x63, 0x72, 0x61, 0x66, 0x74, 0x3a, 0x63, 0x75, 0x74, 0x65, 0x00, 0x10, 0x6d, 0x69, 0x6e, 0x65, 0x63, 0x72, 0x61, 0x66, 0x74, 0x3a, 0x67, 0x72, 0x75, 0x6d, 0x70, 0x79, 0x00, 0x10, 0x6d, 0x69, 0x6e, 0x65, 0x63, 0x72, 0x61, 0x66, 0x74, 0x3a, 0x70, 0x75, 0x67, 0x6c, 0x69, 0x6e, 0x00, 0x0d, 0x6d, 0x69, 0x6e, 0x65, 0x63, 0x72, 0x61, 0x66, 0x74, 0x3a, 0x73, 0x61, 0x64, 0x00 };
char pig_variant[] = { 0x07, 0x15, 0x6d, 0x69, 0x6e, 0x65, 0x63, 0x72, 0x61, 0x66, 0x74, 0x3a, 0x70, 0x69, 0x67, 0x5f, 0x76, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, 0x03, 0x0e, 0x6d, 0x69, 0x6e, 0x65, 0x63, 0x72, 0x61, 0x66, 0x74, 0x3a, 0x63, 0x6f, 0x6c, 0x64, 0x00, 0x13, 0x6d, 0x69, 0x6e, 0x65, 0x63, 0x72, 0x61, 0x66, 0x74, 0x3a, 0x74, 0x65, 0x6d, 0x70, 0x65, 0x72, 0x61, 0x74, 0x65, 0x00, 0x0e, 0x6d, 0x69, 0x6e, 0x65, 0x63, 0x72, 0x61, 0x66, 0x74, 0x3a, 0x77, 0x61, 0x72, 0x6d, 0x00 };
char frog_variant[] = { 0x07, 0x16, 0x6d, 0x69, 0x6e, 0x65, 0x63, 0x72, 0x61, 0x66, 0x74, 0x3a, 0x66, 0x72, 0x6f, 0x67, 0x5f, 0x76, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, 0x03, 0x0e, 0x6d, 0x69, 0x6e, 0x65, 0x63, 0x72, 0x61, 0x66, 0x74, 0x3a, 0x63, 0x6f, 0x6c, 0x64, 0x00, 0x13, 0x6d, 0x69, 0x6e, 0x65, 0x63, 0x72, 0x61, 0x66, 0x74, 0x3a, 0x74, 0x65, 0x6d, 0x70, 0x65, 0x72, 0x61, 0x74, 0x65, 0x00, 0x0e, 0x6d, 0x69, 0x6e, 0x65, 0x63, 0x72, 0x61, 0x66, 0x74, 0x3a, 0x77, 0x61, 0x72, 0x6d, 0x00 };
char cat_variant[] = { 0x07, 0x15, 0x6d, 0x69, 0x6e, 0x65, 0x63, 0x72, 0x61, 0x66, 0x74, 0x3a, 0x63, 0x61, 0x74, 0x5f, 0x76, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, 0x0b, 0x13, 0x6d, 0x69, 0x6e, 0x65, 0x63, 0x72, 0x61, 0x66, 0x74, 0x3a, 0x61, 0x6c, 0x6c, 0x5f, 0x62, 0x6c, 0x61, 0x63, 0x6b, 0x00, 0x0f, 0x6d, 0x69, 0x6e, 0x65, 0x63, 0x72, 0x61, 0x66, 0x74, 0x3a, 0x62, 0x6c, 0x61, 0x63, 0x6b, 0x00, 0x1b, 0x6d, 0x69, 0x6e, 0x65, 0x63, 0x72, 0x61, 0x66, 0x74, 0x3a, 0x62, 0x72, 0x69, 0x74, 0x69, 0x73, 0x68, 0x5f, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x68, 0x61, 0x69, 0x72, 0x00, 0x10, 0x6d, 0x69, 0x6e, 0x65, 0x63, 0x72, 0x61, 0x66, 0x74, 0x3a, 0x63, 0x61, 0x6c, 0x69, 0x63, 0x6f, 0x00, 0x10, 0x6d, 0x69, 0x6e, 0x65, 0x63, 0x72, 0x61, 0x66, 0x74, 0x3a, 0x6a, 0x65, 0x6c, 0x6c, 0x69, 0x65, 0x00, 0x11, 0x6d, 0x69, 0x6e, 0x65, 0x63, 0x72, 0x61, 0x66, 0x74, 0x3a, 0x70, 0x65, 0x72, 0x73, 0x69, 0x61, 0x6e, 0x00, 0x11, 0x6d, 0x69, 0x6e, 0x65, 0x63, 0x72, 0x61, 0x66, 0x74, 0x3a, 0x72, 0x61, 0x67, 0x64, 0x6f, 0x6c, 0x6c, 0x00, 0x0d, 0x6d, 0x69, 0x6e, 0x65, 0x63, 0x72, 0x61, 0x66, 0x74, 0x3a, 0x72, 0x65, 0x64, 0x00, 0x11, 0x6d, 0x69, 0x6e, 0x65, 0x63, 0x72, 0x61, 0x66, 0x74, 0x3a, 0x73, 0x69, 0x61, 0x6d, 0x65, 0x73, 0x65, 0x00, 0x0f, 0x6d, 0x69, 0x6e, 0x65, 0x63, 0x72, 0x61, 0x66, 0x74, 0x3a, 0x74, 0x61, 0x62, 0x62, 0x79, 0x00, 0x0f, 0x6d, 0x69, 0x6e, 0x65, 0x63, 0x72, 0x61, 0x66, 0x74, 0x3a, 0x77, 0x68, 0x69, 0x74, 0x65, 0x00 };
char cow_variant[] = { 0x07, 0x15, 0x6d, 0x69, 0x6e, 0x65, 0x63, 0x72, 0x61, 0x66, 0x74, 0x3a, 0x63, 0x6f, 0x77, 0x5f, 0x76, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, 0x03, 0x0e, 0x6d, 0x69, 0x6e, 0x65, 0x63, 0x72, 0x61, 0x66, 0x74, 0x3a, 0x63, 0x6f, 0x6c, 0x64, 0x00, 0x13, 0x6d, 0x69, 0x6e, 0x65, 0x63, 0x72, 0x61, 0x66, 0x74, 0x3a, 0x74, 0x65, 0x6d, 0x70, 0x65, 0x72, 0x61, 0x74, 0x65, 0x00, 0x0e, 0x6d, 0x69, 0x6e, 0x65, 0x63, 0x72, 0x61, 0x66, 0x74, 0x3a, 0x77, 0x61, 0x72, 0x6d, 0x00 };
char chicken_variant[] = { 0x07, 0x19, 0x6d, 0x69, 0x6e, 0x65, 0x63, 0x72, 0x61, 0x66, 0x74, 0x3a, 0x63, 0x68, 0x69, 0x63, 0x6b, 0x65, 0x6e, 0x5f, 0x76, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, 0x03, 0x0e, 0x6d, 0x69, 0x6e, 0x65, 0x63, 0x72, 0x61, 0x66, 0x74, 0x3a, 0x63, 0x6f, 0x6c, 0x64, 0x00, 0x13, 0x6d, 0x69, 0x6e, 0x65, 0x63, 0x72, 0x61, 0x66, 0x74, 0x3a, 0x74, 0x65, 0x6d, 0x70, 0x65, 0x72, 0x61, 0x74, 0x65, 0x00, 0x0e, 0x6d, 0x69, 0x6e, 0x65, 0x63, 0x72, 0x61, 0x66, 0x74, 0x3a, 0x77, 0x61, 0x72, 0x6d, 0x00 };
writeVarInt(client_fd, sizeof(wolf_sound_variant));
send(client_fd, &wolf_sound_variant, sizeof(wolf_sound_variant), 0);
writeVarInt(client_fd, sizeof(pig_variant));
send(client_fd, &pig_variant, sizeof(pig_variant), 0);
writeVarInt(client_fd, sizeof(frog_variant));
send(client_fd, &frog_variant, sizeof(frog_variant), 0);
writeVarInt(client_fd, sizeof(cat_variant));
send(client_fd, &cat_variant, sizeof(cat_variant), 0);
writeVarInt(client_fd, sizeof(cow_variant));
send(client_fd, &cow_variant, sizeof(cow_variant), 0);
writeVarInt(client_fd, sizeof(chicken_variant));
send(client_fd, &chicken_variant, sizeof(chicken_variant), 0);
// update water tag
writeVarInt(client_fd, 3 + 5 + 2 + 5 + 1 + 1);
writeByte(client_fd, 0x0D);

View File

@@ -1,529 +0,0 @@
#include <stdint.h>
#include "registries.h"
// Binary contents of required "Registry Data" packets
uint8_t registries_bin[] = {
0xd4, 0x04, 0x07, 0x0e, 0x62, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x5f, 0x70,
0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x2b, 0x04, 0x62, 0x61, 0x73, 0x65,
0x00, 0x06, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x00, 0x06, 0x62, 0x72,
0x69, 0x63, 0x6b, 0x73, 0x00, 0x06, 0x63, 0x69, 0x72, 0x63, 0x6c, 0x65,
0x00, 0x07, 0x63, 0x72, 0x65, 0x65, 0x70, 0x65, 0x72, 0x00, 0x05, 0x63,
0x72, 0x6f, 0x73, 0x73, 0x00, 0x0c, 0x63, 0x75, 0x72, 0x6c, 0x79, 0x5f,
0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x00, 0x0d, 0x64, 0x69, 0x61, 0x67,
0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x6c, 0x65, 0x66, 0x74, 0x00, 0x0e, 0x64,
0x69, 0x61, 0x67, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x72, 0x69, 0x67, 0x68,
0x74, 0x00, 0x10, 0x64, 0x69, 0x61, 0x67, 0x6f, 0x6e, 0x61, 0x6c, 0x5f,
0x75, 0x70, 0x5f, 0x6c, 0x65, 0x66, 0x74, 0x00, 0x11, 0x64, 0x69, 0x61,
0x67, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x75, 0x70, 0x5f, 0x72, 0x69, 0x67,
0x68, 0x74, 0x00, 0x04, 0x66, 0x6c, 0x6f, 0x77, 0x00, 0x06, 0x66, 0x6c,
0x6f, 0x77, 0x65, 0x72, 0x00, 0x05, 0x67, 0x6c, 0x6f, 0x62, 0x65, 0x00,
0x08, 0x67, 0x72, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x74, 0x00, 0x0b, 0x67,
0x72, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x75, 0x70, 0x00, 0x06,
0x67, 0x75, 0x73, 0x74, 0x65, 0x72, 0x00, 0x0f, 0x68, 0x61, 0x6c, 0x66,
0x5f, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x6f, 0x6e, 0x74, 0x61, 0x6c, 0x00,
0x16, 0x68, 0x61, 0x6c, 0x66, 0x5f, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x6f,
0x6e, 0x74, 0x61, 0x6c, 0x5f, 0x62, 0x6f, 0x74, 0x74, 0x6f, 0x6d, 0x00,
0x0d, 0x68, 0x61, 0x6c, 0x66, 0x5f, 0x76, 0x65, 0x72, 0x74, 0x69, 0x63,
0x61, 0x6c, 0x00, 0x13, 0x68, 0x61, 0x6c, 0x66, 0x5f, 0x76, 0x65, 0x72,
0x74, 0x69, 0x63, 0x61, 0x6c, 0x5f, 0x72, 0x69, 0x67, 0x68, 0x74, 0x00,
0x06, 0x6d, 0x6f, 0x6a, 0x61, 0x6e, 0x67, 0x00, 0x06, 0x70, 0x69, 0x67,
0x6c, 0x69, 0x6e, 0x00, 0x07, 0x72, 0x68, 0x6f, 0x6d, 0x62, 0x75, 0x73,
0x00, 0x05, 0x73, 0x6b, 0x75, 0x6c, 0x6c, 0x00, 0x0d, 0x73, 0x6d, 0x61,
0x6c, 0x6c, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x70, 0x65, 0x73, 0x00, 0x12,
0x73, 0x71, 0x75, 0x61, 0x72, 0x65, 0x5f, 0x62, 0x6f, 0x74, 0x74, 0x6f,
0x6d, 0x5f, 0x6c, 0x65, 0x66, 0x74, 0x00, 0x13, 0x73, 0x71, 0x75, 0x61,
0x72, 0x65, 0x5f, 0x62, 0x6f, 0x74, 0x74, 0x6f, 0x6d, 0x5f, 0x72, 0x69,
0x67, 0x68, 0x74, 0x00, 0x0f, 0x73, 0x71, 0x75, 0x61, 0x72, 0x65, 0x5f,
0x74, 0x6f, 0x70, 0x5f, 0x6c, 0x65, 0x66, 0x74, 0x00, 0x10, 0x73, 0x71,
0x75, 0x61, 0x72, 0x65, 0x5f, 0x74, 0x6f, 0x70, 0x5f, 0x72, 0x69, 0x67,
0x68, 0x74, 0x00, 0x0e, 0x73, 0x74, 0x72, 0x61, 0x69, 0x67, 0x68, 0x74,
0x5f, 0x63, 0x72, 0x6f, 0x73, 0x73, 0x00, 0x0d, 0x73, 0x74, 0x72, 0x69,
0x70, 0x65, 0x5f, 0x62, 0x6f, 0x74, 0x74, 0x6f, 0x6d, 0x00, 0x0d, 0x73,
0x74, 0x72, 0x69, 0x70, 0x65, 0x5f, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72,
0x00, 0x0f, 0x73, 0x74, 0x72, 0x69, 0x70, 0x65, 0x5f, 0x64, 0x6f, 0x77,
0x6e, 0x6c, 0x65, 0x66, 0x74, 0x00, 0x10, 0x73, 0x74, 0x72, 0x69, 0x70,
0x65, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x72, 0x69, 0x67, 0x68, 0x74, 0x00,
0x0b, 0x73, 0x74, 0x72, 0x69, 0x70, 0x65, 0x5f, 0x6c, 0x65, 0x66, 0x74,
0x00, 0x0d, 0x73, 0x74, 0x72, 0x69, 0x70, 0x65, 0x5f, 0x6d, 0x69, 0x64,
0x64, 0x6c, 0x65, 0x00, 0x0c, 0x73, 0x74, 0x72, 0x69, 0x70, 0x65, 0x5f,
0x72, 0x69, 0x67, 0x68, 0x74, 0x00, 0x0a, 0x73, 0x74, 0x72, 0x69, 0x70,
0x65, 0x5f, 0x74, 0x6f, 0x70, 0x00, 0x0f, 0x74, 0x72, 0x69, 0x61, 0x6e,
0x67, 0x6c, 0x65, 0x5f, 0x62, 0x6f, 0x74, 0x74, 0x6f, 0x6d, 0x00, 0x0c,
0x74, 0x72, 0x69, 0x61, 0x6e, 0x67, 0x6c, 0x65, 0x5f, 0x74, 0x6f, 0x70,
0x00, 0x10, 0x74, 0x72, 0x69, 0x61, 0x6e, 0x67, 0x6c, 0x65, 0x73, 0x5f,
0x62, 0x6f, 0x74, 0x74, 0x6f, 0x6d, 0x00, 0x0d, 0x74, 0x72, 0x69, 0x61,
0x6e, 0x67, 0x6c, 0x65, 0x73, 0x5f, 0x74, 0x6f, 0x70, 0x00, 0x90, 0x01,
0x07, 0x09, 0x63, 0x68, 0x61, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x07,
0x04, 0x63, 0x68, 0x61, 0x74, 0x00, 0x0d, 0x65, 0x6d, 0x6f, 0x74, 0x65,
0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x00, 0x14, 0x6d, 0x73,
0x67, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x5f, 0x69, 0x6e,
0x63, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x00, 0x14, 0x6d, 0x73, 0x67, 0x5f,
0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x5f, 0x6f, 0x75, 0x74, 0x67,
0x6f, 0x69, 0x6e, 0x67, 0x00, 0x0b, 0x73, 0x61, 0x79, 0x5f, 0x63, 0x6f,
0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x00, 0x19, 0x74, 0x65, 0x61, 0x6d, 0x5f,
0x6d, 0x73, 0x67, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x5f,
0x69, 0x6e, 0x63, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x00, 0x19, 0x74, 0x65,
0x61, 0x6d, 0x5f, 0x6d, 0x73, 0x67, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x61,
0x6e, 0x64, 0x5f, 0x6f, 0x75, 0x74, 0x67, 0x6f, 0x69, 0x6e, 0x67, 0x00,
0xcb, 0x04, 0x07, 0x0b, 0x64, 0x61, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x74,
0x79, 0x70, 0x65, 0x30, 0x05, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x00, 0x11,
0x62, 0x61, 0x64, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x61, 0x77, 0x6e, 0x5f,
0x70, 0x6f, 0x69, 0x6e, 0x74, 0x00, 0x06, 0x63, 0x61, 0x63, 0x74, 0x75,
0x73, 0x00, 0x08, 0x63, 0x61, 0x6d, 0x70, 0x66, 0x69, 0x72, 0x65, 0x00,
0x08, 0x63, 0x72, 0x61, 0x6d, 0x6d, 0x69, 0x6e, 0x67, 0x00, 0x0d, 0x64,
0x72, 0x61, 0x67, 0x6f, 0x6e, 0x5f, 0x62, 0x72, 0x65, 0x61, 0x74, 0x68,
0x00, 0x05, 0x64, 0x72, 0x6f, 0x77, 0x6e, 0x00, 0x07, 0x64, 0x72, 0x79,
0x5f, 0x6f, 0x75, 0x74, 0x00, 0x0b, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x5f,
0x70, 0x65, 0x61, 0x72, 0x6c, 0x00, 0x09, 0x65, 0x78, 0x70, 0x6c, 0x6f,
0x73, 0x69, 0x6f, 0x6e, 0x00, 0x04, 0x66, 0x61, 0x6c, 0x6c, 0x00, 0x0d,
0x66, 0x61, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x5f, 0x61, 0x6e, 0x76, 0x69,
0x6c, 0x00, 0x0d, 0x66, 0x61, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x5f, 0x62,
0x6c, 0x6f, 0x63, 0x6b, 0x00, 0x12, 0x66, 0x61, 0x6c, 0x6c, 0x69, 0x6e,
0x67, 0x5f, 0x73, 0x74, 0x61, 0x6c, 0x61, 0x63, 0x74, 0x69, 0x74, 0x65,
0x00, 0x08, 0x66, 0x69, 0x72, 0x65, 0x62, 0x61, 0x6c, 0x6c, 0x00, 0x09,
0x66, 0x69, 0x72, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x00, 0x0d, 0x66,
0x6c, 0x79, 0x5f, 0x69, 0x6e, 0x74, 0x6f, 0x5f, 0x77, 0x61, 0x6c, 0x6c,
0x00, 0x06, 0x66, 0x72, 0x65, 0x65, 0x7a, 0x65, 0x00, 0x07, 0x67, 0x65,
0x6e, 0x65, 0x72, 0x69, 0x63, 0x00, 0x0c, 0x67, 0x65, 0x6e, 0x65, 0x72,
0x69, 0x63, 0x5f, 0x6b, 0x69, 0x6c, 0x6c, 0x00, 0x09, 0x68, 0x6f, 0x74,
0x5f, 0x66, 0x6c, 0x6f, 0x6f, 0x72, 0x00, 0x07, 0x69, 0x6e, 0x5f, 0x66,
0x69, 0x72, 0x65, 0x00, 0x07, 0x69, 0x6e, 0x5f, 0x77, 0x61, 0x6c, 0x6c,
0x00, 0x0e, 0x69, 0x6e, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x5f, 0x6d,
0x61, 0x67, 0x69, 0x63, 0x00, 0x04, 0x6c, 0x61, 0x76, 0x61, 0x00, 0x0e,
0x6c, 0x69, 0x67, 0x68, 0x74, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x62, 0x6f,
0x6c, 0x74, 0x00, 0x05, 0x6d, 0x61, 0x67, 0x69, 0x63, 0x00, 0x0a, 0x6d,
0x6f, 0x62, 0x5f, 0x61, 0x74, 0x74, 0x61, 0x63, 0x6b, 0x00, 0x13, 0x6d,
0x6f, 0x62, 0x5f, 0x61, 0x74, 0x74, 0x61, 0x63, 0x6b, 0x5f, 0x6e, 0x6f,
0x5f, 0x61, 0x67, 0x67, 0x72, 0x6f, 0x00, 0x0e, 0x6d, 0x6f, 0x62, 0x5f,
0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x6c, 0x65, 0x00, 0x07,
0x6f, 0x6e, 0x5f, 0x66, 0x69, 0x72, 0x65, 0x00, 0x0c, 0x6f, 0x75, 0x74,
0x5f, 0x6f, 0x66, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x00, 0x0e, 0x6f,
0x75, 0x74, 0x73, 0x69, 0x64, 0x65, 0x5f, 0x62, 0x6f, 0x72, 0x64, 0x65,
0x72, 0x00, 0x0d, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x5f, 0x61, 0x74,
0x74, 0x61, 0x63, 0x6b, 0x00, 0x10, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72,
0x5f, 0x65, 0x78, 0x70, 0x6c, 0x6f, 0x73, 0x69, 0x6f, 0x6e, 0x00, 0x0a,
0x73, 0x6f, 0x6e, 0x69, 0x63, 0x5f, 0x62, 0x6f, 0x6f, 0x6d, 0x00, 0x04,
0x73, 0x70, 0x69, 0x74, 0x00, 0x0a, 0x73, 0x74, 0x61, 0x6c, 0x61, 0x67,
0x6d, 0x69, 0x74, 0x65, 0x00, 0x06, 0x73, 0x74, 0x61, 0x72, 0x76, 0x65,
0x00, 0x05, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x00, 0x10, 0x73, 0x77, 0x65,
0x65, 0x74, 0x5f, 0x62, 0x65, 0x72, 0x72, 0x79, 0x5f, 0x62, 0x75, 0x73,
0x68, 0x00, 0x06, 0x74, 0x68, 0x6f, 0x72, 0x6e, 0x73, 0x00, 0x06, 0x74,
0x68, 0x72, 0x6f, 0x77, 0x6e, 0x00, 0x07, 0x74, 0x72, 0x69, 0x64, 0x65,
0x6e, 0x74, 0x00, 0x15, 0x75, 0x6e, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62,
0x75, 0x74, 0x65, 0x64, 0x5f, 0x66, 0x69, 0x72, 0x65, 0x62, 0x61, 0x6c,
0x6c, 0x00, 0x0b, 0x77, 0x69, 0x6e, 0x64, 0x5f, 0x63, 0x68, 0x61, 0x72,
0x67, 0x65, 0x00, 0x06, 0x77, 0x69, 0x74, 0x68, 0x65, 0x72, 0x00, 0x0c,
0x77, 0x69, 0x74, 0x68, 0x65, 0x72, 0x5f, 0x73, 0x6b, 0x75, 0x6c, 0x6c,
0x00, 0x42, 0x07, 0x0e, 0x64, 0x69, 0x6d, 0x65, 0x6e, 0x73, 0x69, 0x6f,
0x6e, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x04, 0x09, 0x6f, 0x76, 0x65, 0x72,
0x77, 0x6f, 0x72, 0x6c, 0x64, 0x00, 0x0f, 0x6f, 0x76, 0x65, 0x72, 0x77,
0x6f, 0x72, 0x6c, 0x64, 0x5f, 0x63, 0x61, 0x76, 0x65, 0x73, 0x00, 0x07,
0x74, 0x68, 0x65, 0x5f, 0x65, 0x6e, 0x64, 0x00, 0x0a, 0x74, 0x68, 0x65,
0x5f, 0x6e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x00, 0xc4, 0x03, 0x07, 0x10,
0x70, 0x61, 0x69, 0x6e, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x76, 0x61, 0x72,
0x69, 0x61, 0x6e, 0x74, 0x32, 0x05, 0x61, 0x6c, 0x62, 0x61, 0x6e, 0x00,
0x05, 0x61, 0x7a, 0x74, 0x65, 0x63, 0x00, 0x06, 0x61, 0x7a, 0x74, 0x65,
0x63, 0x32, 0x00, 0x08, 0x62, 0x61, 0x63, 0x6b, 0x79, 0x61, 0x72, 0x64,
0x00, 0x07, 0x62, 0x61, 0x72, 0x6f, 0x71, 0x75, 0x65, 0x00, 0x04, 0x62,
0x6f, 0x6d, 0x62, 0x00, 0x07, 0x62, 0x6f, 0x75, 0x71, 0x75, 0x65, 0x74,
0x00, 0x0d, 0x62, 0x75, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x6b,
0x75, 0x6c, 0x6c, 0x00, 0x04, 0x62, 0x75, 0x73, 0x74, 0x00, 0x08, 0x63,
0x61, 0x76, 0x65, 0x62, 0x69, 0x72, 0x64, 0x00, 0x08, 0x63, 0x68, 0x61,
0x6e, 0x67, 0x69, 0x6e, 0x67, 0x00, 0x05, 0x63, 0x6f, 0x74, 0x61, 0x6e,
0x00, 0x07, 0x63, 0x6f, 0x75, 0x72, 0x62, 0x65, 0x74, 0x00, 0x07, 0x63,
0x72, 0x65, 0x65, 0x62, 0x65, 0x74, 0x00, 0x0b, 0x64, 0x6f, 0x6e, 0x6b,
0x65, 0x79, 0x5f, 0x6b, 0x6f, 0x6e, 0x67, 0x00, 0x05, 0x65, 0x61, 0x72,
0x74, 0x68, 0x00, 0x07, 0x65, 0x6e, 0x64, 0x62, 0x6f, 0x73, 0x73, 0x00,
0x04, 0x66, 0x65, 0x72, 0x6e, 0x00, 0x08, 0x66, 0x69, 0x67, 0x68, 0x74,
0x65, 0x72, 0x73, 0x00, 0x07, 0x66, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67,
0x00, 0x04, 0x66, 0x69, 0x72, 0x65, 0x00, 0x06, 0x67, 0x72, 0x61, 0x68,
0x61, 0x6d, 0x00, 0x06, 0x68, 0x75, 0x6d, 0x62, 0x6c, 0x65, 0x00, 0x05,
0x6b, 0x65, 0x62, 0x61, 0x62, 0x00, 0x07, 0x6c, 0x6f, 0x77, 0x6d, 0x69,
0x73, 0x74, 0x00, 0x05, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x00, 0x0a, 0x6d,
0x65, 0x64, 0x69, 0x74, 0x61, 0x74, 0x69, 0x76, 0x65, 0x00, 0x03, 0x6f,
0x72, 0x62, 0x00, 0x08, 0x6f, 0x77, 0x6c, 0x65, 0x6d, 0x6f, 0x6e, 0x73,
0x00, 0x07, 0x70, 0x61, 0x73, 0x73, 0x61, 0x67, 0x65, 0x00, 0x08, 0x70,
0x69, 0x67, 0x73, 0x63, 0x65, 0x6e, 0x65, 0x00, 0x05, 0x70, 0x6c, 0x61,
0x6e, 0x74, 0x00, 0x07, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x00,
0x04, 0x70, 0x6f, 0x6e, 0x64, 0x00, 0x04, 0x70, 0x6f, 0x6f, 0x6c, 0x00,
0x0c, 0x70, 0x72, 0x61, 0x69, 0x72, 0x69, 0x65, 0x5f, 0x72, 0x69, 0x64,
0x65, 0x00, 0x03, 0x73, 0x65, 0x61, 0x00, 0x08, 0x73, 0x6b, 0x65, 0x6c,
0x65, 0x74, 0x6f, 0x6e, 0x00, 0x0f, 0x73, 0x6b, 0x75, 0x6c, 0x6c, 0x5f,
0x61, 0x6e, 0x64, 0x5f, 0x72, 0x6f, 0x73, 0x65, 0x73, 0x00, 0x05, 0x73,
0x74, 0x61, 0x67, 0x65, 0x00, 0x0a, 0x73, 0x75, 0x6e, 0x66, 0x6c, 0x6f,
0x77, 0x65, 0x72, 0x73, 0x00, 0x06, 0x73, 0x75, 0x6e, 0x73, 0x65, 0x74,
0x00, 0x05, 0x74, 0x69, 0x64, 0x65, 0x73, 0x00, 0x08, 0x75, 0x6e, 0x70,
0x61, 0x63, 0x6b, 0x65, 0x64, 0x00, 0x04, 0x76, 0x6f, 0x69, 0x64, 0x00,
0x08, 0x77, 0x61, 0x6e, 0x64, 0x65, 0x72, 0x65, 0x72, 0x00, 0x09, 0x77,
0x61, 0x73, 0x74, 0x65, 0x6c, 0x61, 0x6e, 0x64, 0x00, 0x05, 0x77, 0x61,
0x74, 0x65, 0x72, 0x00, 0x04, 0x77, 0x69, 0x6e, 0x64, 0x00, 0x06, 0x77,
0x69, 0x74, 0x68, 0x65, 0x72, 0x00, 0x64, 0x07, 0x0d, 0x74, 0x72, 0x69,
0x6d, 0x5f, 0x6d, 0x61, 0x74, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x0a, 0x08,
0x61, 0x6d, 0x65, 0x74, 0x68, 0x79, 0x73, 0x74, 0x00, 0x06, 0x63, 0x6f,
0x70, 0x70, 0x65, 0x72, 0x00, 0x07, 0x64, 0x69, 0x61, 0x6d, 0x6f, 0x6e,
0x64, 0x00, 0x07, 0x65, 0x6d, 0x65, 0x72, 0x61, 0x6c, 0x64, 0x00, 0x04,
0x67, 0x6f, 0x6c, 0x64, 0x00, 0x04, 0x69, 0x72, 0x6f, 0x6e, 0x00, 0x05,
0x6c, 0x61, 0x70, 0x69, 0x73, 0x00, 0x09, 0x6e, 0x65, 0x74, 0x68, 0x65,
0x72, 0x69, 0x74, 0x65, 0x00, 0x06, 0x71, 0x75, 0x61, 0x72, 0x74, 0x7a,
0x00, 0x08, 0x72, 0x65, 0x64, 0x73, 0x74, 0x6f, 0x6e, 0x65, 0x00, 0x89,
0x01, 0x07, 0x0c, 0x74, 0x72, 0x69, 0x6d, 0x5f, 0x70, 0x61, 0x74, 0x74,
0x65, 0x72, 0x6e, 0x12, 0x04, 0x62, 0x6f, 0x6c, 0x74, 0x00, 0x05, 0x63,
0x6f, 0x61, 0x73, 0x74, 0x00, 0x04, 0x64, 0x75, 0x6e, 0x65, 0x00, 0x03,
0x65, 0x79, 0x65, 0x00, 0x04, 0x66, 0x6c, 0x6f, 0x77, 0x00, 0x04, 0x68,
0x6f, 0x73, 0x74, 0x00, 0x06, 0x72, 0x61, 0x69, 0x73, 0x65, 0x72, 0x00,
0x03, 0x72, 0x69, 0x62, 0x00, 0x06, 0x73, 0x65, 0x6e, 0x74, 0x72, 0x79,
0x00, 0x06, 0x73, 0x68, 0x61, 0x70, 0x65, 0x72, 0x00, 0x07, 0x73, 0x69,
0x6c, 0x65, 0x6e, 0x63, 0x65, 0x00, 0x05, 0x73, 0x6e, 0x6f, 0x75, 0x74,
0x00, 0x05, 0x73, 0x70, 0x69, 0x72, 0x65, 0x00, 0x04, 0x74, 0x69, 0x64,
0x65, 0x00, 0x03, 0x76, 0x65, 0x78, 0x00, 0x04, 0x77, 0x61, 0x72, 0x64,
0x00, 0x09, 0x77, 0x61, 0x79, 0x66, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x00,
0x04, 0x77, 0x69, 0x6c, 0x64, 0x00, 0x54, 0x07, 0x0c, 0x77, 0x6f, 0x6c,
0x66, 0x5f, 0x76, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, 0x09, 0x05, 0x61,
0x73, 0x68, 0x65, 0x6e, 0x00, 0x05, 0x62, 0x6c, 0x61, 0x63, 0x6b, 0x00,
0x08, 0x63, 0x68, 0x65, 0x73, 0x74, 0x6e, 0x75, 0x74, 0x00, 0x04, 0x70,
0x61, 0x6c, 0x65, 0x00, 0x05, 0x72, 0x75, 0x73, 0x74, 0x79, 0x00, 0x05,
0x73, 0x6e, 0x6f, 0x77, 0x79, 0x00, 0x07, 0x73, 0x70, 0x6f, 0x74, 0x74,
0x65, 0x64, 0x00, 0x07, 0x73, 0x74, 0x72, 0x69, 0x70, 0x65, 0x64, 0x00,
0x05, 0x77, 0x6f, 0x6f, 0x64, 0x73, 0x00, 0x93, 0x07, 0x07, 0x0e, 0x77,
0x6f, 0x72, 0x6c, 0x64, 0x67, 0x65, 0x6e, 0x2f, 0x62, 0x69, 0x6f, 0x6d,
0x65, 0x40, 0x08, 0x62, 0x61, 0x64, 0x6c, 0x61, 0x6e, 0x64, 0x73, 0x00,
0x0d, 0x62, 0x61, 0x6d, 0x62, 0x6f, 0x6f, 0x5f, 0x6a, 0x75, 0x6e, 0x67,
0x6c, 0x65, 0x00, 0x0d, 0x62, 0x61, 0x73, 0x61, 0x6c, 0x74, 0x5f, 0x64,
0x65, 0x6c, 0x74, 0x61, 0x73, 0x00, 0x05, 0x62, 0x65, 0x61, 0x63, 0x68,
0x00, 0x0c, 0x62, 0x69, 0x72, 0x63, 0x68, 0x5f, 0x66, 0x6f, 0x72, 0x65,
0x73, 0x74, 0x00, 0x0c, 0x63, 0x68, 0x65, 0x72, 0x72, 0x79, 0x5f, 0x67,
0x72, 0x6f, 0x76, 0x65, 0x00, 0x0a, 0x63, 0x6f, 0x6c, 0x64, 0x5f, 0x6f,
0x63, 0x65, 0x61, 0x6e, 0x00, 0x0e, 0x63, 0x72, 0x69, 0x6d, 0x73, 0x6f,
0x6e, 0x5f, 0x66, 0x6f, 0x72, 0x65, 0x73, 0x74, 0x00, 0x0b, 0x64, 0x61,
0x72, 0x6b, 0x5f, 0x66, 0x6f, 0x72, 0x65, 0x73, 0x74, 0x00, 0x0f, 0x64,
0x65, 0x65, 0x70, 0x5f, 0x63, 0x6f, 0x6c, 0x64, 0x5f, 0x6f, 0x63, 0x65,
0x61, 0x6e, 0x00, 0x09, 0x64, 0x65, 0x65, 0x70, 0x5f, 0x64, 0x61, 0x72,
0x6b, 0x00, 0x11, 0x64, 0x65, 0x65, 0x70, 0x5f, 0x66, 0x72, 0x6f, 0x7a,
0x65, 0x6e, 0x5f, 0x6f, 0x63, 0x65, 0x61, 0x6e, 0x00, 0x13, 0x64, 0x65,
0x65, 0x70, 0x5f, 0x6c, 0x75, 0x6b, 0x65, 0x77, 0x61, 0x72, 0x6d, 0x5f,
0x6f, 0x63, 0x65, 0x61, 0x6e, 0x00, 0x0a, 0x64, 0x65, 0x65, 0x70, 0x5f,
0x6f, 0x63, 0x65, 0x61, 0x6e, 0x00, 0x06, 0x64, 0x65, 0x73, 0x65, 0x72,
0x74, 0x00, 0x0f, 0x64, 0x72, 0x69, 0x70, 0x73, 0x74, 0x6f, 0x6e, 0x65,
0x5f, 0x63, 0x61, 0x76, 0x65, 0x73, 0x00, 0x0b, 0x65, 0x6e, 0x64, 0x5f,
0x62, 0x61, 0x72, 0x72, 0x65, 0x6e, 0x73, 0x00, 0x0d, 0x65, 0x6e, 0x64,
0x5f, 0x68, 0x69, 0x67, 0x68, 0x6c, 0x61, 0x6e, 0x64, 0x73, 0x00, 0x0c,
0x65, 0x6e, 0x64, 0x5f, 0x6d, 0x69, 0x64, 0x6c, 0x61, 0x6e, 0x64, 0x73,
0x00, 0x0f, 0x65, 0x72, 0x6f, 0x64, 0x65, 0x64, 0x5f, 0x62, 0x61, 0x64,
0x6c, 0x61, 0x6e, 0x64, 0x73, 0x00, 0x0d, 0x66, 0x6c, 0x6f, 0x77, 0x65,
0x72, 0x5f, 0x66, 0x6f, 0x72, 0x65, 0x73, 0x74, 0x00, 0x06, 0x66, 0x6f,
0x72, 0x65, 0x73, 0x74, 0x00, 0x0c, 0x66, 0x72, 0x6f, 0x7a, 0x65, 0x6e,
0x5f, 0x6f, 0x63, 0x65, 0x61, 0x6e, 0x00, 0x0c, 0x66, 0x72, 0x6f, 0x7a,
0x65, 0x6e, 0x5f, 0x70, 0x65, 0x61, 0x6b, 0x73, 0x00, 0x0c, 0x66, 0x72,
0x6f, 0x7a, 0x65, 0x6e, 0x5f, 0x72, 0x69, 0x76, 0x65, 0x72, 0x00, 0x05,
0x67, 0x72, 0x6f, 0x76, 0x65, 0x00, 0x0a, 0x69, 0x63, 0x65, 0x5f, 0x73,
0x70, 0x69, 0x6b, 0x65, 0x73, 0x00, 0x0c, 0x6a, 0x61, 0x67, 0x67, 0x65,
0x64, 0x5f, 0x70, 0x65, 0x61, 0x6b, 0x73, 0x00, 0x06, 0x6a, 0x75, 0x6e,
0x67, 0x6c, 0x65, 0x00, 0x0e, 0x6c, 0x75, 0x6b, 0x65, 0x77, 0x61, 0x72,
0x6d, 0x5f, 0x6f, 0x63, 0x65, 0x61, 0x6e, 0x00, 0x0a, 0x6c, 0x75, 0x73,
0x68, 0x5f, 0x63, 0x61, 0x76, 0x65, 0x73, 0x00, 0x0e, 0x6d, 0x61, 0x6e,
0x67, 0x72, 0x6f, 0x76, 0x65, 0x5f, 0x73, 0x77, 0x61, 0x6d, 0x70, 0x00,
0x06, 0x6d, 0x65, 0x61, 0x64, 0x6f, 0x77, 0x00, 0x0f, 0x6d, 0x75, 0x73,
0x68, 0x72, 0x6f, 0x6f, 0x6d, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73,
0x00, 0x0d, 0x6e, 0x65, 0x74, 0x68, 0x65, 0x72, 0x5f, 0x77, 0x61, 0x73,
0x74, 0x65, 0x73, 0x00, 0x05, 0x6f, 0x63, 0x65, 0x61, 0x6e, 0x00, 0x17,
0x6f, 0x6c, 0x64, 0x5f, 0x67, 0x72, 0x6f, 0x77, 0x74, 0x68, 0x5f, 0x62,
0x69, 0x72, 0x63, 0x68, 0x5f, 0x66, 0x6f, 0x72, 0x65, 0x73, 0x74, 0x00,
0x15, 0x6f, 0x6c, 0x64, 0x5f, 0x67, 0x72, 0x6f, 0x77, 0x74, 0x68, 0x5f,
0x70, 0x69, 0x6e, 0x65, 0x5f, 0x74, 0x61, 0x69, 0x67, 0x61, 0x00, 0x17,
0x6f, 0x6c, 0x64, 0x5f, 0x67, 0x72, 0x6f, 0x77, 0x74, 0x68, 0x5f, 0x73,
0x70, 0x72, 0x75, 0x63, 0x65, 0x5f, 0x74, 0x61, 0x69, 0x67, 0x61, 0x00,
0x06, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x73, 0x00, 0x05, 0x72, 0x69, 0x76,
0x65, 0x72, 0x00, 0x07, 0x73, 0x61, 0x76, 0x61, 0x6e, 0x6e, 0x61, 0x00,
0x0f, 0x73, 0x61, 0x76, 0x61, 0x6e, 0x6e, 0x61, 0x5f, 0x70, 0x6c, 0x61,
0x74, 0x65, 0x61, 0x75, 0x00, 0x11, 0x73, 0x6d, 0x61, 0x6c, 0x6c, 0x5f,
0x65, 0x6e, 0x64, 0x5f, 0x69, 0x73, 0x6c, 0x61, 0x6e, 0x64, 0x73, 0x00,
0x0b, 0x73, 0x6e, 0x6f, 0x77, 0x79, 0x5f, 0x62, 0x65, 0x61, 0x63, 0x68,
0x00, 0x0c, 0x73, 0x6e, 0x6f, 0x77, 0x79, 0x5f, 0x70, 0x6c, 0x61, 0x69,
0x6e, 0x73, 0x00, 0x0c, 0x73, 0x6e, 0x6f, 0x77, 0x79, 0x5f, 0x73, 0x6c,
0x6f, 0x70, 0x65, 0x73, 0x00, 0x0b, 0x73, 0x6e, 0x6f, 0x77, 0x79, 0x5f,
0x74, 0x61, 0x69, 0x67, 0x61, 0x00, 0x10, 0x73, 0x6f, 0x75, 0x6c, 0x5f,
0x73, 0x61, 0x6e, 0x64, 0x5f, 0x76, 0x61, 0x6c, 0x6c, 0x65, 0x79, 0x00,
0x0d, 0x73, 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, 0x6a, 0x75, 0x6e, 0x67,
0x6c, 0x65, 0x00, 0x0b, 0x73, 0x74, 0x6f, 0x6e, 0x79, 0x5f, 0x70, 0x65,
0x61, 0x6b, 0x73, 0x00, 0x0b, 0x73, 0x74, 0x6f, 0x6e, 0x79, 0x5f, 0x73,
0x68, 0x6f, 0x72, 0x65, 0x00, 0x10, 0x73, 0x75, 0x6e, 0x66, 0x6c, 0x6f,
0x77, 0x65, 0x72, 0x5f, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x73, 0x00, 0x05,
0x73, 0x77, 0x61, 0x6d, 0x70, 0x00, 0x05, 0x74, 0x61, 0x69, 0x67, 0x61,
0x00, 0x07, 0x74, 0x68, 0x65, 0x5f, 0x65, 0x6e, 0x64, 0x00, 0x08, 0x74,
0x68, 0x65, 0x5f, 0x76, 0x6f, 0x69, 0x64, 0x00, 0x0a, 0x77, 0x61, 0x72,
0x6d, 0x5f, 0x6f, 0x63, 0x65, 0x61, 0x6e, 0x00, 0x0d, 0x77, 0x61, 0x72,
0x70, 0x65, 0x64, 0x5f, 0x66, 0x6f, 0x72, 0x65, 0x73, 0x74, 0x00, 0x10,
0x77, 0x69, 0x6e, 0x64, 0x73, 0x77, 0x65, 0x70, 0x74, 0x5f, 0x66, 0x6f,
0x72, 0x65, 0x73, 0x74, 0x00, 0x18, 0x77, 0x69, 0x6e, 0x64, 0x73, 0x77,
0x65, 0x70, 0x74, 0x5f, 0x67, 0x72, 0x61, 0x76, 0x65, 0x6c, 0x6c, 0x79,
0x5f, 0x68, 0x69, 0x6c, 0x6c, 0x73, 0x00, 0x0f, 0x77, 0x69, 0x6e, 0x64,
0x73, 0x77, 0x65, 0x70, 0x74, 0x5f, 0x68, 0x69, 0x6c, 0x6c, 0x73, 0x00,
0x11, 0x77, 0x69, 0x6e, 0x64, 0x73, 0x77, 0x65, 0x70, 0x74, 0x5f, 0x73,
0x61, 0x76, 0x61, 0x6e, 0x6e, 0x61, 0x00, 0x0f, 0x77, 0x6f, 0x6f, 0x64,
0x65, 0x64, 0x5f, 0x62, 0x61, 0x64, 0x6c, 0x61, 0x6e, 0x64, 0x73, 0x00
};
// Block palette
uint16_t block_palette[] = { 0, 1, 2, 3, 4, 5, 6, 7, 9, 10, 11, 13, 14, 15, 16, 17, 18, 19, 20, 21, 23, 25, 26, 27, 28, 29, 31, 33, 35, 37, 39, 41, 43, 50, 85, 86, 118, 119, 123, 124, 125, 129, 130, 131, 132, 133, 134, 135, 137, 140, 143, 146, 149, 152, 155, 158, 161, 164, 166, 169, 172, 175, 178, 181, 184, 187, 190, 193, 196, 199, 202, 205, 208, 211, 214, 217, 220, 223, 226, 229, 232, 235, 238, 241, 244, 247, 250, 279, 307, 335, 363, 391, 419, 447, 475, 503, 531, 559, 560, 561, 562, 563, 564, 565, 567, 578, 579, 580, 582, 1734, 1750, 1766, 1782, 1798, 1814, 1830, 1846, 1862, 1878, 1894, 1910, 1926, 1942, 1958, 1974, 2000, 2024, 2041, 2047, 2048, 2049, 2050, 2051, 2052, 2053, 2054, 2063, 2093, 2094, 2095, 2096, 2097, 2098, 2099, 2100, 2101, 2102, 2103, 2104, 2105, 2106, 2107, 2108, 2121, 2122, 2123, 2124, 2125, 2126, 2127, 2128, 2129, 2130, 2131, 2132, 2133, 2134, 2135, 2136, 2137, 2138, 2139, 2141, 2142, 2206, 2399, 2400, 2401, 2919, 2927, 2949, 3019, 4338, 4339, 4340, 4341, 4342, 4350, 4359, 4367, 4399, 4431, 4463, 4495, 4527, 4559, 4591, 4623, 4655, 4697, 4751, 4759, 4789, 4971, 5035, 5099, 5163, 5227, 5291, 5355, 5419, 5483, 5547, 5611, 5675, 5811, 5827, 5839, 5893, 5895, 5897, 5899, 5901, 5903, 5905, 5907, 5909, 5911, 5913, 5915, 5916, 5935, 5950, 5958, 5959, 5960, 5976, 5977, 5978, 5995, 6027, 6028, 6029, 6030, 6032, 6035, 6037, 6042, 6045, 6049, 6053, 6063, 6124, 6125, 6126, 6127 };
// Block-to-item mapping
uint8_t B_to_I[] = { 0, 1, 2, 3, 4, 5, 6, 7, 27, 28, 29, 30, 35, 36, 37, 38, 39, 40, 41, 42, 177, 43, 44, 45, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 0, 59, 60, 62, 63, 61, 70, 71, 66, 67, 64, 65, 80, 134, 135, 136, 137, 138, 139, 141, 140, 142, 143, 144, 147, 149, 150, 151, 152, 153, 154, 155, 148, 156, 170, 171, 172, 173, 174, 175, 176, 178, 179, 159, 160, 161, 162, 163, 164, 165, 166, 167, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 76, 77, 197, 0, 198, 199, 200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 201, 202, 203, 207, 204, 209, 210, 211, 0, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 244, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 243, 242, 247, 248, 92, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 78, 79, 93, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; // 256
// Item-to-block mapping
uint8_t I_to_B (uint16_t item) {
if (item == 0) return 0;
if (item == 1) return 1;
if (item == 2) return 2;
if (item == 3) return 3;
if (item == 4) return 4;
if (item == 5) return 5;
if (item == 6) return 6;
if (item == 7) return 7;
if (item == 27) return 8;
if (item == 28) return 9;
if (item == 29) return 10;
if (item == 30) return 11;
if (item == 35) return 12;
if (item == 36) return 13;
if (item == 37) return 14;
if (item == 38) return 15;
if (item == 39) return 16;
if (item == 40) return 17;
if (item == 41) return 18;
if (item == 42) return 19;
if (item == 177) return 20;
if (item == 43) return 21;
if (item == 44) return 22;
if (item == 45) return 23;
if (item == 48) return 24;
if (item == 49) return 25;
if (item == 50) return 26;
if (item == 51) return 27;
if (item == 52) return 28;
if (item == 53) return 29;
if (item == 54) return 30;
if (item == 55) return 31;
if (item == 56) return 32;
if (item == 57) return 33;
if (item == 58) return 34;
if (item == 59) return 36;
if (item == 60) return 37;
if (item == 62) return 38;
if (item == 63) return 39;
if (item == 61) return 40;
if (item == 70) return 41;
if (item == 71) return 42;
if (item == 66) return 43;
if (item == 67) return 44;
if (item == 64) return 45;
if (item == 65) return 46;
if (item == 80) return 47;
if (item == 134) return 48;
if (item == 135) return 49;
if (item == 136) return 50;
if (item == 137) return 51;
if (item == 138) return 52;
if (item == 139) return 53;
if (item == 141) return 54;
if (item == 140) return 55;
if (item == 142) return 56;
if (item == 143) return 57;
if (item == 144) return 58;
if (item == 147) return 59;
if (item == 149) return 60;
if (item == 150) return 61;
if (item == 151) return 62;
if (item == 152) return 63;
if (item == 153) return 64;
if (item == 154) return 65;
if (item == 155) return 66;
if (item == 148) return 67;
if (item == 156) return 68;
if (item == 170) return 69;
if (item == 171) return 70;
if (item == 172) return 71;
if (item == 173) return 72;
if (item == 174) return 73;
if (item == 175) return 74;
if (item == 176) return 75;
if (item == 178) return 76;
if (item == 179) return 77;
if (item == 159) return 78;
if (item == 160) return 79;
if (item == 161) return 80;
if (item == 162) return 81;
if (item == 163) return 82;
if (item == 164) return 83;
if (item == 165) return 84;
if (item == 166) return 85;
if (item == 167) return 86;
if (item == 182) return 87;
if (item == 183) return 88;
if (item == 184) return 89;
if (item == 185) return 90;
if (item == 186) return 91;
if (item == 187) return 92;
if (item == 188) return 93;
if (item == 189) return 94;
if (item == 190) return 95;
if (item == 191) return 96;
if (item == 192) return 97;
if (item == 193) return 98;
if (item == 194) return 99;
if (item == 195) return 100;
if (item == 76) return 101;
if (item == 77) return 102;
if (item == 197) return 103;
if (item == 699) return 104;
if (item == 198) return 105;
if (item == 199) return 106;
if (item == 200) return 107;
if (item == 712) return 108;
if (item == 1041) return 109;
if (item == 1042) return 110;
if (item == 1043) return 111;
if (item == 1044) return 112;
if (item == 1045) return 113;
if (item == 1046) return 114;
if (item == 1047) return 115;
if (item == 1048) return 116;
if (item == 1049) return 117;
if (item == 1050) return 118;
if (item == 1051) return 119;
if (item == 1052) return 120;
if (item == 1053) return 121;
if (item == 1054) return 122;
if (item == 1055) return 123;
if (item == 1056) return 124;
if (item == 797) return 125;
if (item == 798) return 126;
if (item == 694) return 127;
if (item == 201) return 128;
if (item == 202) return 129;
if (item == 203) return 130;
if (item == 207) return 131;
if (item == 204) return 132;
if (item == 209) return 133;
if (item == 210) return 134;
if (item == 211) return 135;
if (item == 693) return 136;
if (item == 213) return 137;
if (item == 214) return 138;
if (item == 215) return 139;
if (item == 216) return 140;
if (item == 217) return 141;
if (item == 218) return 142;
if (item == 219) return 143;
if (item == 220) return 144;
if (item == 221) return 145;
if (item == 222) return 146;
if (item == 223) return 147;
if (item == 224) return 148;
if (item == 225) return 149;
if (item == 226) return 150;
if (item == 227) return 151;
if (item == 228) return 152;
if (item == 229) return 153;
if (item == 244) return 154;
if (item == 232) return 155;
if (item == 233) return 156;
if (item == 234) return 157;
if (item == 235) return 158;
if (item == 236) return 159;
if (item == 237) return 160;
if (item == 238) return 161;
if (item == 239) return 162;
if (item == 240) return 163;
if (item == 241) return 164;
if (item == 243) return 165;
if (item == 242) return 166;
if (item == 247) return 167;
if (item == 248) return 168;
if (item == 92) return 169;
if (item == 90) return 170;
if (item == 304) return 171;
if (item == 710) return 172;
if (item == 305) return 173;
if (item == 306) return 174;
if (item == 308) return 175;
if (item == 309) return 176;
if (item == 310) return 177;
if (item == 317) return 178;
if (item == 318) return 179;
if (item == 412) return 180;
if (item == 319) return 181;
if (item == 78) return 182;
if (item == 79) return 183;
if (item == 93) return 184;
if (item == 320) return 185;
if (item == 911) return 186;
if (item == 321) return 187;
if (item == 322) return 188;
if (item == 943) return 189;
if (item == 944) return 190;
if (item == 945) return 191;
if (item == 947) return 192;
if (item == 948) return 193;
if (item == 946) return 194;
if (item == 949) return 195;
if (item == 950) return 196;
if (item == 951) return 197;
if (item == 952) return 198;
if (item == 744) return 199;
if (item == 323) return 200;
if (item == 799) return 201;
if (item == 324) return 202;
if (item == 955) return 203;
if (item == 956) return 204;
if (item == 957) return 205;
if (item == 959) return 206;
if (item == 960) return 207;
if (item == 958) return 208;
if (item == 961) return 209;
if (item == 962) return 210;
if (item == 965) return 211;
if (item == 966) return 212;
if (item == 963) return 213;
if (item == 964) return 214;
if (item == 703) return 215;
if (item == 727) return 216;
if (item == 743) return 217;
if (item == 731) return 218;
if (item == 732) return 219;
if (item == 733) return 220;
if (item == 734) return 221;
if (item == 735) return 222;
if (item == 736) return 223;
if (item == 737) return 224;
if (item == 738) return 225;
if (item == 739) return 226;
if (item == 740) return 227;
if (item == 72) return 228;
if (item == 73) return 229;
if (item == 689) return 230;
if (item == 713) return 231;
if (item == 325) return 232;
if (item == 326) return 233;
if (item == 327) return 234;
if (item == 328) return 235;
if (item == 329) return 236;
if (item == 330) return 237;
if (item == 256) return 238;
if (item == 331) return 239;
if (item == 332) return 240;
if (item == 347) return 241;
if (item == 348) return 242;
if (item == 349) return 243;
if (item == 350) return 244;
if (item == 351) return 245;
if (item == 353) return 246;
if (item == 354) return 247;
if (item == 345) return 248;
if (item == 346) return 249;
if (item == 1040) return 250;
if (item == 691) return 251;
if (item == 501) return 252;
if (item == 502) return 253;
if (item == 503) return 254;
if (item == 504) return 255;
return 0;
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff